每当我打电话shutdownNow()或shutdown()不关机时.我读到了一些线程,它说不能保证关闭 - 有人能为我提供一个好方法吗?
我正在运行一个高度并发的Java程序.虽然许多线程正在向执行程序服务提交任务,但在某个点上主线程会调用ExecutorService.shutdownNow().
在这个动作之后,我希望:
Thread.currentThread().isInterrupted()由于我处于以下情况:
ExecutorService.shutdownNow(),但没有关闭,即ExecutorService.awaitTermination(long, TimeUnit)永远不会返回trueBlockingQueue.take()ExecutorService.shutdownNow(),挂起线程死于InterruptedException上BlockingQueue.take()我想在调用之前这些线程已经收到BlockingQueue.take()了中断,并且忽略了InterruptedException.
我也想知道是否ExecutorService.shutdownNow()是线程安全的,即,即使线程池正在接收许多提交,它也能正常工作.
总而言之,我有两个问题:
ExecutorService.shutdownNow()不是线程安全的?我正在执行一个java代码,我有一个AtomicInteger1000个线程正在尝试执行的代码incrementAndGet().我期待最终值为1000.但每次运行都会产生各种不同的值.代码如下:
class task implements Runnable {
AtomicInteger i ;
task(AtomicInteger ai) {i =ai ;}
public void run() { i.incrementAndGet() ; }
}
class jlt {
public static void main(String[] args) throws Exception {
AtomicInteger atomicInt = new AtomicInteger(0);
ExecutorService executor = Executors.newFixedThreadPool(2);
for(int i=1; i<=1000; i++)
executor.submit(new task(atomicInt)) ;
executor.shutdown() ;
System.out.println(atomicInt.get()); // 1000 is expected
}
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚我在这里或在我的理解中犯的错误
我正在检查ExecutorService#shutDown()方法的javadoc,它指出:
启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务.如果已经关闭,调用没有其他影响.
我理解"被执行"为:它等待直到先前提交的任务完成执行.但它也指出:
此方法不会等待先前提交的任务完成执行.使用awaitTermination来做到这一点.
这似乎说它取消了已经提交的任务.
有人可以澄清一下调用shutdown时会发生什么,而之前提交的一些任务还没有完成执行?
编辑
我使用执行程序来启动一些任务,但之后我不再需要执行程序,所以我想让它知道它可以在任务完成时释放线程.
shutdown() 的 Java 文档说:
关闭
无效关闭()
启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,则调用不会产生任何附加效果。该方法不等待之前提交的任务完成执行。使用awaitTermination 来做到这一点。
这两种说法不是矛盾吗?(...之前提交的任务执行完毕VS不等待之前提交的任务完成执行)?
我尝试了一个示例程序shutdown()。而且它确实等待先前提交的任务完成,这与shutdownNow()!
为什么下面的代码I have shutdown true在应该等待阶乘任务完成时返回?
public class RunnableMain {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
RunnableFactorialTask runnableFactorialTask = new RunnableFactorialTask(5);
executor.submit(runnableFactorialTask);
executor.shutdown();
System.out.println(" I have shutdown.."+executor.isShutdown());
}
}
class RunnableFactorialTask implements Runnable {
private int num = 0;
public RunnableFactorialTask(int num) {
this.num = num;
}
@Override
public void run() {
int factorial = 1;
try {
Thread.currentThread().sleep(6000);
} catch (InterruptedException …Run Code Online (Sandbox Code Playgroud)