我需要阻止线程的执行,直到从另一个线程恢复。所以我使用wait()
方法编写了自己的实现。这似乎有效,但远非简单。
有没有现成的解决方案?最好在java SE 6中?或者我必须使用自己的实现?我找不到任何东西。
更新 进一步来说。我需要工作 - > block->外部发布 - >工作 - >来自线程1的结束行为以及从线程2释放块的能力。
答案 0 :(得分:4)
查看java.util.conucurrent
中的课程...
如果我能正确理解您的问题,CountDownLatch
可能是您问题的解决方案。
答案 1 :(得分:1)
我需要阻止线程的执行,直到从另一个线程恢复。
信息不足。您是否需要一个完全由一个线程控制并由另一个线程服从的开/关开关?对于旋转门来说,这可能是一个很好的应用:Pause thread from another thread(s) and also stop/start it yet from another thread
或者你需要"一次性"行为? (即"后台"线程每次"前景"线程都允许它去做一件事。)这对于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
创建1
:CountDownLatch countDownLatch = new CountDownLatch (1);
然后再次与两个主题分享对它的引用。
当您希望阻止执行第一个帖子时,请调用countDownLatch.await();
。
第一个线程可以通过在第二个线程中的某个地方调用countDownLatch.countDown();
来恢复。