Pau*_*hek 5 java concurrency multithreading
我正在寻找协调多个多线程任务的好解决方案.
基本上我有2个任务,我打电话A和B需要被不同的线程比主线程中执行.
但B必须在A完成后开始.A而且他们B自己包含几个应该并行运行的部分,叫做A1, A2, ... B1, B2, ....
并且有一个来自外部的呼叫者,无论进度如何,都需要重新启动整个工作.我怎么能这样做呢?如果每个子任务(A1,...)已经完成,我想创建一些保存信息的布尔数组,如果是,则启动B.如果已经取消,则检查每个方法中的每几行代码.但在我看来,这不是一个优雅的解决方案,并且有可能以令人兴奋的方式协调这一点.

以下是使用 countDownLatches 和 Exectors 的示例实现:
public class Test {
static ExecutorService maintaskExecutor = Executors.newFixedThreadPool(2);
private static CountDownLatch latch = new CountDownLatch(0);
public Test() {
}
public static void main(String[] args) {
maintaskExecutor.submit(new runnableA());
maintaskExecutor.submit(new runnableB());
}
private void restart() {
maintaskExecutor.shutdownNow();
maintaskExecutor.submit(new runnableA());
maintaskExecutor.submit(new runnableB());
}
private static class runnableA implements Runnable {
ExecutorService taskExecutorA = Executors.newFixedThreadPool(3);
private final CountDownLatch latchA = new CountDownLatch(3);
@Override
public void run() {
try {
Runnable a1Runnable = createA1Runnable();
Runnable a2Runnable = createA1Runnable();
Runnable a3Runnable = createA1Runnable();
taskExecutorA.submit(a1Runnable);
taskExecutorA.submit(a2Runnable);
taskExecutorA.submit(a3Runnable);
latchA.await();
latch.countDown();
} catch (InterruptedException e) {
taskExecutorA.shutdownNow();
}
}
private Runnable createA1Runnable() {
return new Runnable() {
@Override
public void run() {
//Design this task to respond to interruption by checking if the thread has been interrupted
while(!Thread.interrupted()){
//Do the work
}
return;
}
};
}
}
private static class runnableB implements Runnable{
private final CountDownLatch latch = new CountDownLatch(3);
ExecutorService taskExecutorB = Executors.newFixedThreadPool(3);
public void run(){
try {
latch.await();
//Creates the tasks B1, B2, ...
} catch (InterruptedException e) {
taskExecutorB.shutdownNow();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
869 次 |
| 最近记录: |