我想为线程池中执行的每个线程(非future.get(时间,单位))设置超时。目前我有以下代码:
private static void rpcService() throws Exception{
long s = System.currentTimeMillis();
TimeUnit.MILLISECONDS.sleep(100);//
long e = System.currentTimeMillis();
if(e-s > 100){
System.out.println((e-s) + " MILLISECONDS");
}
}
public static void main(String[] args) throws Exception {
ExecutorService service = Executors.newFixedThreadPool(500);
while (true) {
TimeUnit.MILLISECONDS.sleep(1);
service.submit(new Runnable() {
public void run() {
try {
//the rpc timeout is 100 milliseconds
rpcService();
} catch (Exception e) {}
}
});
}
}
为什么输出如下:
139 MILLISECONDS
133 MILLISECONDS
129 MILLISECONDS
128 MILLISECONDS
127 MILLISECONDS
126 MILLISECONDS
125 MILLISECONDS
123 MILLISECONDS
122 MILLISECONDS
121 MILLISECONDS
151 MILLISECONDS
......
答案 0 :(得分:1)
System.currentTimeMillis()
不是衡量持续时间的准确方法。您应该更喜欢System.nanoTime()
但是还有更多的事情发生在sleep
所花费的时间,你有500个线程竞争你拥有的核心数量,所以有一点点上下文切换。如果你使用https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newSingleThreadExecutor(),你就会非常接近睡眠时间。
答案 1 :(得分:0)