小编mar*_*rts的帖子

Java线程 - 奇怪的Thread.interrupted()和future.cancel(true)行为

我想管理由TaskExecutor返回的Futures对象列表.
我有这样的事情

 List<Future<String>> list 

 void process(ProcessThis processThis) {     
    for ( ...) {
       Future<String> future = taskExecutor.submit(processThis);
       list.add(future)
    }
 }


 void removeFutures() {
    for(Future future : list) {
       assert future.cancel(true);
 }
Run Code Online (Sandbox Code Playgroud)

ProcessThis是一个实现Callable <String>并检查Thread.interrupted()状态的任务

    public String call() {
        while (true) {
            if (Thread.interrupted()) {
                break;
            }
            doSomething();
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当调用Thread.interrupted()时,只有并发线程的子集返回'true'.
removeFutures()中的断言为每个被删除的未来返回true(我也检查了isDone()和isCompleted().
被中断的线程数是随机的.超过15个运行线程有时13个被中断,有时2个... .
我真的不明白的地方是个问题.如果我叫future.cancel(真),并返回true ...然后我检查Thread.interrupted(这被称为只有一次),我希望这回也是如此.
我错过了什么你知道吗?

我在构建Java 1.6.0_02-B05

java multithreading future interrupt threadpool

5
推荐指数
2
解决办法
6981
查看次数

标签 统计

future ×1

interrupt ×1

java ×1

multithreading ×1

threadpool ×1