为java threadPool中的每个线程设置超时

时间:2017-08-19 03:51:41

标签: java multithreading threadpool executorservice

我想为线程池中执行的每个线程(非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
......

2 个答案:

答案 0 :(得分:1)

System.currentTimeMillis()不是衡量持续时间的准确方法。您应该更喜欢System.nanoTime()

但是还有更多的事情发生在sleep所花费的时间,你有500个线程竞争你拥有的核心数量,所以有一点点上下文切换。如果你使用https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newSingleThreadExecutor(),你就会非常接近睡眠时间。

答案 1 :(得分:0)

因为Thread.sleep()是:

  

受制于系统计时器和调度程序的精确性和准确性。

这不是实时保证。