在Java 7中,您可以选择放置@SafeVarargs
注释以抑制在使用不可重新生成的varargs参数编译方法时获得的警告.Project Coin的提议规定,当方法确保只有与varargs参数相同类型的元素存储在varargs数组中时,才应使用注释.
什么是非安全方法的例子?
如果我有课Foo
:
public class Foo<T> {
public Foo(T t) {
//do something
}
public static <E> void bar(E e) {
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
为什么Foo.bar("String");
推断它E
是一个String(因此不会抛出编译器警告),但new Foo("String");
不推断它T
是一个String?
我正试图找到一种方法来检测闪存驱动器何时插入我的计算机.到目前为止,我发现的解决方案是轮询FileSystem#getFileStores
更改.这确实告诉我什么时候插入了闪存驱动器,但据我所知,没有办法检索它的位置.FileStore#type
并且FileStore#name
它们看起来都非常不可靠,因为它们的返回值是特定于实现的,但它们似乎是唯一可能返回任何可能有助于查找目录的相关信息的方法FileStore
.
考虑到这一点,以下代码:
public class Test {
public static void main(String[] args) throws IOException {
for (FileStore store : FileSystems.getDefault().getFileStores()) {
System.out.println(store);
System.out.println("\t" + store.name());
System.out.println("\t" + store.type());
System.out.println();
}
}
}
Run Code Online (Sandbox Code Playgroud)
给我这个输出:
/ (/dev/sda5)
/dev/sda5
ext4
/* snip */
/media/TI103426W0D (/dev/sda2)
/dev/sda2
fuseblk
/media/flashdrive (/dev/sdb1)
/dev/sdb1
vfat
Run Code Online (Sandbox Code Playgroud)
事实证明,FileStore#type
返回驱动器的格式并FileStore#name
返回驱动器的设备文件的位置.据我所知,唯一具有驱动器位置的toString
方法是方法,但从中提取路径名称似乎很危险,因为我不确定该特定解决方案在其他操作系统上的表现如何Java的未来版本.
有没有我在这里缺少的东西,或者纯粹用Java是不可能的?
系统信息:
$ java -version
java version "1.7.0_03"
OpenJDK Runtime Environment (IcedTea7 2.1.1pre) (7~u3-2.1.1~pre1-1ubuntu2)
OpenJDK Client VM (build …
Run Code Online (Sandbox Code Playgroud) 我正在查看源代码,WeakHashMap
并偶然发现:
private final ReferenceQueue<Object> queue = new ReferenceQueue<>();
private void expungeStaleEntries() {
for (Object x; (x = queue.poll()) != null; ) {
synchronized (queue) {
/* snip */
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么这个方法同步ReferenceQueue
?WeakHashMap
本身并不声称是线程安全的:
与大多数集合类一样,此类不同步.可以使用Collections.synchronizedMap方法构造同步的WeakHashMap.
这使我相信这个实现细节是以某种方式确保ReferenceQueue
自身的线程安全(因为GC将自己修改它Thread
).但是,文档ReferenceQueue
中没有提到任何关于任何并发问题的内容,并且看一下源代码,ReferenceQueue
发现它甚至没有自身同步(它使用内部锁).
为什么WeakHashMap
同步它ReferenceQueue
呢?我ReferenceQueue
每次使用它时都应该同步吗?
所以在我正在制作的这个应用程序中,用户点击一个按钮,然后该按钮启动一个程序.此按钮将具有应用程序的标题和图标.我只需要知道如何获得图标,有点像这样:Windows http://goo.gl/5WjdT
所以我想知道的是:
提前致谢!
我有以下简单的代码:
package main;
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) throws InterruptedException {
new Main();
}
public Main() throws InterruptedException {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.schedule(new MyRunnable(), 10, TimeUnit.SECONDS);
System.out.println("Shutting down...");
executor.shutdown();
System.out.println("Awaiting termination...");
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);
System.out.println("Main finished!");
}
private class MyRunnable implements Runnable {
public void run() {
System.out.println("Finished running!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,虽然我的真实代码比这更复杂,但我可以在这些方面隔离问题.代码基本上等待10秒运行runnable,然后通知主程序的结束.
但是,我注意到了10秒钟,我的核心之一用于100%.
如果我评论这一行:
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);
Run Code Online (Sandbox Code Playgroud)
cpu核心也以100%使用,主程序也在Runnable之前完成.
如果我评论这一行:
executor.shutdown();
Run Code Online (Sandbox Code Playgroud)
cpu已正确使用但程序无法完成.
如果我评论前两行,则cpu正确使用但主程序无法完成.
executor.shutdown();
做某种忙碌的等待而不是仅仅禁用提交新任务?附加细节:
$ java -version
java version "1.6.0_26" …
Run Code Online (Sandbox Code Playgroud) 不同的是JTextArea
,JTextPane
没有选择关闭换行.我找到了一个解决JTextPane
s中换行的方法,但对于这样一个简单的问题来说它似乎太冗长了.有一个更好的方法吗?
SwingWorker#setProgress
IllegalArgumentException
如果参数不是从0到100 ,则抛出一个.我认为该setProgress
方法的主要目的是更新a JProgressBar
(就像在本教程中一样).如果是这种情况,为什么SwingWorker
当JProgressBar
进度不受限制时,将进度限制为[0,100] ?
我想,当被通知SocketChannel
有其close
调用的方法.我首先想到的是创建该通知时,监听器的包装implCloseSelectableChannel
方法被调用(因为该close
方法本身声明final
中AbstractInterruptibleChannel
).这个解决方案有效,但当我尝试注册时,Selector
我会得到一个IllegalSelectorException
因为以下检查SelectorImpl
:
/* */ protected final SelectionKey register(AbstractSelectableChannel paramAbstractSelectableChannel, int paramInt, Object paramObject)
/* */ {
/* 128 */ if (!(paramAbstractSelectableChannel instanceof SelChImpl))
/* 129 */ throw new IllegalSelectorException();
Run Code Online (Sandbox Code Playgroud)
现在,我不能覆盖register
的方法来委托给包裹SocketChannel
,因为它宣布final
的AbstractSelectableChannel
,我无法实现SelChImpl
,因为它在默认的知名度sun.nio.ch
包.我可以看到从这里出发的唯一方法是使我自己SelectorProvider
和Selector
,但是,似乎是矫枉过正的东西那么简单.
是否有更简单的方法SocketChannel
在关闭时收到通知或我是否需要重新考虑我的程序设计?
SocketChannelWrapper
例:
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketOption; …
Run Code Online (Sandbox Code Playgroud) 我有一个小系统,我想提供一个可以分析错误/异常并提出可能的解决方案的产品.
所以我想要一种解析java Exception的方法(因为我只在日志中使用它们[我不想影响实际的系统]).
解析之后,我想将它保存在数据库中,并将其与以前保存的异常(以某种格式)进行比较,以便找到最接近的匹配异常.
我想到了以下想法:"在D处C处的A处的XException"将保存为[XException,A,B,C,D],我将以某种方式在我的DB中搜索:[XException,?,?, ?]哪个最接近.例如:[XException,A,G,C,D]非常好.
您如何看待这些想法?
任何有效的方法来解析异常?
有效或更好的方法来定义两个例外之间的距离?
知道任何可以做到这一点的开源 - 我觉得没有找到任何.
谢谢.