相关疑难解决方法(0)

如何关闭ExecutorService?

每当我打电话shutdownNow()shutdown()不关机时.我读到了一些线程,它说不能保证关闭 - 有人能为我提供一个好方法吗?

java multithreading shutdown executorservice

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

ExecutorService.shutdownNow()不会关闭线程

我正在运行一个高度并发的Java程序.虽然许多线程正在向执行程序服务提交任务,但在某个点上主线程会调用ExecutorService.shutdownNow().

在这个动作之后,我希望:

  1. 执行程序服务不接受任何其他任务
  2. 执行程序服务的队列是清楚的
  3. 其余正在运行的工作程序被中断,也就是说,如果他们正确管理InterruptedException和/或明确检查,他们会在某一时刻关闭 Thread.currentThread().isInterrupted()

由于我处于以下情况:

  1. 执行程序服务由于a而"关闭" ExecutorService.shutdownNow(),但没有关闭,即ExecutorService.awaitTermination(long, TimeUnit)永远不会返回true
  2. 有一些挂起的线程由我的执行器服务管理等待a BlockingQueue.take()
  3. 如果我再次调用ExecutorService.shutdownNow(),挂起线程死于InterruptedExceptionBlockingQueue.take()

我想在调用之前这些线程已经收到BlockingQueue.take()了中断,并且忽略了InterruptedException.

我也想知道是否ExecutorService.shutdownNow()是线程安全的,即,即使线程池正在接收许多提交,它也能正常工作.

总而言之,我有两个问题:

  1. 有没有其他方案可以解释我的情况?
  2. 是否可能ExecutorService.shutdownNow()不是线程安全的?

java executorservice java.util.concurrent

8
推荐指数
1
解决办法
2068
查看次数

在1000个线程中增加Java中的AtomicInteger不会生成值1000

我正在执行一个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)

我无法弄清楚我在这里或在我的理解中犯的错误

java multithreading

4
推荐指数
2
解决办法
521
查看次数

ExecutorService.shutDown()是否取消现有任务?

我正在检查ExecutorService#shutDown()方法的javadoc,它指出:

启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务.如果已经关闭,调用没有其他影响.

我理解"被执行"为:它等待直到先前提交的任务完成执行.但它也指出:

此方法不会等待先前提交的任务完成执行.使用awaitTermination来做到这一点.

这似乎说它取消了已经提交的任务.

有人可以澄清一下调用shutdown时会发生什么,而之前提交的一些任务还没有完成执行?

编辑
我使用执行程序来启动一些任务,但之后我不再需要执行程序,所以我想让它知道它可以在任务完成时释放线程.

java multithreading

2
推荐指数
1
解决办法
424
查看次数

当池中仍有线程运行时,为什么 executor.isShutdown() 返回 true?

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)

java multithreading thread-safety

0
推荐指数
1
解决办法
899
查看次数