多线程异常处理免费资源

时间:2018-04-26 07:59:17

标签: java multithreading thread-safety executorservice threadpoolexecutor

我试图处理多线程问题中生成的所有异常,以消除内存泄漏,中断或执行异常(我不想传播它们)等。如果我中断了一个帖子(Thread.currentThread().interrupt()),shutdownNow()下面的finallyThreadPoolExecutor service = new ThreadPoolExecutor(coreSize, maxSize); // do stuff try { List<Future<?>> futures = new ArrayList<Future<?>>(); for (Item item : items) { // processing logic Runnable myTask = new MyTask(); futures.add(service.submit(myTask)); } for (Future<?> f : futures) { f.get(); } } catch (Exception e) { // todo } finally { service.shutdown(); try { service.awaitTermination(duration, TimeUnit.SECONDS); } catch (Exception e) { // todo Thread.currentThread().interrupt(); } finally { if (!service.isTerminated()) { service.shutdownNow(); } } } 多余的?

@Nullable
private Runnable nulltest(@Nullable String myNullableString) {
    if(myNullableString == null) {
        return null;
    }


    return new Runnable() {
        @Override
        public void run() {
            System.out.println("This string is not null: " + myNullableString);
        }
    };
}

2 个答案:

答案 0 :(得分:1)

如果shutdownNow 忽略任何中断,则

shutdown的行为与MyTask相同。在这种情况下,是的,shutdownNow是多余的。

另一方面,如果中断可能会影响 MyTask,则需要shutdownNow来停止工作线程。

答案 1 :(得分:1)

仅在以下情况下才是多余的:

  • 所有正在运行的任务都不可中断。
  • 阻塞队列中没有缓存任务。

调用shutdown将使执行程序不接受新任务,但仍将执行阻塞队列中缓存的任务。

致电shutdownNow

  • interrupt正在运行的所有任务
  • 取消队列中的所有任务