在java SE中是否有线程块/恢复的标准实现?

时间:2015-06-22 12:59:33

标签: java multithreading wait

我需要阻止线程的执行,直到从另一个线程恢复。所以我使用wait()方法编写了自己的实现。这似乎有效,但远非简单。

有没有现成的解决方案?最好在java SE 6中?或者我必须使用自己的实现?我找不到任何东西。

更新 进一步来说。我需要工作 - > block->外部发布 - >工作 - >来自线程1的结束行为以及从线程2释放块的能力。

4 个答案:

答案 0 :(得分:4)

查看java.util.conucurrent中的课程... 如果我能正确理解您的问题,CountDownLatch可能是您问题的解决方案。

答案 1 :(得分:1)

  

我需要阻止线程的执行,直到从另一个线程恢复。

信息不足。您是否需要一个完全由一个线程控制并由另一个线程服从的开/关开关?对于旋转门来说,这可能是一个很好的应用:Pause thread from another thread(s) and also stop/start it yet from another thread

或者你需要&#34;一次性&#34;行为? (即&#34;后台&#34;线程每次&#34;前景&#34;线程都允许它去做一件事。)这对于java.util.concurrent.Semaphore来说是一个很好的应用。< / p>

或者,你还需要其他一些行为吗?

答案 2 :(得分:0)

使用ExecutorService并调用invokeAll也可能是一个选项。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html

这种方式还允许您指定应该完成所有任务的超时。如果您想要一个响应式应用程序,这通常是一个非常好的主意。

答案 3 :(得分:0)

受其他答案的启发,我找到了两个解决方案:

<强>第一

在第一个帖子中创建Semaphore没有(0)许可:Semaphore semaphore = new Semaphore(0);。并与您的第二个帖子分享对它的引用。

在第一个线程中做一些工作,并在希望停止执行时调用semaphore.acquire();

一段时间后,从第二个线程调用semaphore.release();以取消阻止第一个线程。

<强>第二

使用初始计数CountDownLatch创建1CountDownLatch countDownLatch = new CountDownLatch (1);然后再次与两个主题分享对它的引用。

当您希望阻止执行第一个帖子时,请调用countDownLatch.await();

第一个线程可以通过在第二个线程中的某个地方调用countDownLatch.countDown();来恢复。