Java 加入两个不同的服务
我想连接两个正在ExecutorService中执行的线程Java 加入两个不同的服务,java,multithreading,parallel-processing,java.util.concurrent,Java,Multithreading,Parallel Processing,Java.util.concurrent,我想连接两个正在ExecutorService中执行的线程 public class CURD { public static ExecutorService executorService = Executors.newCachedThreadPool(); @Autowired Logging logging; public void Update(List<? extends HBase> save, List<? extends HBase>
public class CURD {
public static ExecutorService executorService = Executors.newCachedThreadPool();
@Autowired
Logging logging;
public void Update(List<? extends HBase> save, List<? extends HBase> delete) {
Thread t = new Thread(() -> {
System.out.println("Started Main Thread...");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End Main Thread...");
},"Thread-1");
logging.setPredecessor(t);
executorService.submit(t);
}
}
如果要在一组线程之间进行同步,可以使用 Java类: 允许一组线程全部等待的同步辅助工具 彼此到达一个共同的障碍点。骑自行车的人很有用 在涉及固定大小线程组的程序中,必须 偶尔互相等待。这种势垒被称为循环势垒,因为 释放等待的线程后,可以重新使用它 为此,首先使用相应的参与方数量创建
CyclicBarrier
对象,即:
从Java文档中可以看出,各方是:
在触发屏障之前必须调用{@link#wait}的线程数
非正式地说,parties是指在所有线程向前移动之前,必须调用循环屏障并等待的线程数
之后,您需要将barrier实例对象引用传递给应该等待的每个线程,并相应地调用wait
(即barrier.wait()
)。具体如下:
public void Update(..., CyclicBarrier barrier) {
Thread t = new Thread(() -> {
System.out.println("Started Main Thread...");
try {
Thread.sleep(1500);
barrier.await(); // <--- wait on the barrier
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("End Main Thread...");
},"Thread-1");
...
}
并将其传递给线程2
,由于您希望此线程等待线程1
,因此调用block_thread2.await()代码>
并向线程1
添加wait.countDown()代码>:
因此,以这种方式,线程2
将等待线程1
,但线程1
将永远不会等待线程2
private final CyclicBarrier barrier = new CyclicBarrier(NUMBER_OF_PARIES);
public void Update(..., CyclicBarrier barrier) {
Thread t = new Thread(() -> {
System.out.println("Started Main Thread...");
try {
Thread.sleep(1500);
barrier.await(); // <--- wait on the barrier
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("End Main Thread...");
},"Thread-1");
...
}
private final CountDownLatch block_thread2 = new CountDownLatch(1);
Thread run = new Thread( () ->{
try {
....
block_thread2.await(); // wait for Thread 2
} catch (InterruptedException e) {
// deal with it
}
});
...
public void Update(...) {
Thread t = new Thread(() -> {
System.out.println("Started Main Thread...");
try {
Thread.sleep(1500);
wait.countDown();
} catch (InterruptedException e) {
// deal with it
}
System.out.println("End Main Thread...");
},"Thread-1");
...
}