ExecutorService에서 실행되는 두 개의 스레드를 결합하고 싶었습니다.
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);
}
}
이급: 이 클래스 스레드는 첫 번째 스레드가 완료 될 때까지 기다려야합니다. 그러나 첫 번째 스레드가 완료 될 때까지 기다리지 않습니다. 이것이 올바른 방법인지 확실하지 않습니다.
누군가 ExecutorService에서 실행되는 두 개의 스레드를 결합하는 방법을 알려 주실 수 있습니까?
import static com.demo.executorService;
public class Logging {
private Thread predecessor;
public void setPredecessor(Thread t) {
this.predecessor = t;
}
private void loggingInfo() {
Thread run = new Thread( () ->{
try {
if (predecessor != null) {
System.out.println(Thread.currentThread().getName() + " Started");
predecessor.join();
System.out.println(Thread.currentThread().getName() + " Finished");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
addTask(run);
}
public void addTask(Runnable run) {
System.out.println("Runnable Thread logAround.....");
CompletableFuture.runAsync((run), executorService).exceptionally(ex -> {
System.out.println("exception occurred " + ex);
return null;
});
}
}
- 답변 # 1
관련 자료
- php - SQL은 두 개의 다른 테이블을 조인합니다
- appletv - 내 Apple TV를 다른 집에 연결하려면 어떻게합니까?
- r - 조건을 사용하여 두 테이블을 조인하는 방법
- javascript - 두 개체를 하나로 결합하여 키 업데이트
- php - 모든 레코드가있는 두 테이블 조인
- R에서 두 데이터 프레임 결합 및 일치
- firebase - Flutter, 두 가지 앱으로 채팅
- command line - Linux에서 두 파일을 결합하는 방법은 무엇입니까?
- sql - 두 테이블 결합보기
- python - 내부 조인으로 두 개의 데이터 프레임 조인
- oracle - sql - 특정 방식으로 두 개의 열을 결합하는 방법은 무엇입니까?
- node.js - VS 코드에서 두 개의 다른 eslintrcjson을 사용하는 방법은 무엇입니까?
- mysql - 동일한 기본 키로 두 테이블을 조인하는 방법은 무엇입니까?
- c# - 서로 다른 두 항목을 묶는 방법
스레드 집합간에 동기화하려면 다음을 사용할 수 있습니다. 이를위한 Java Class CyclicBarrier.
이를 달성하려면 먼저
CyclicBarrier
수를 가진 개체파티즉 :공식적으로 자바 문서에서 당사자는 다음과 같이 읽을 수 있습니다.
비공식적으로, 모든 스레드가 앞으로 나아갈 수 있기 전에 해당 장벽을 호출하고 대기해야하는 스레드 수입니다. 이후에 대기해야하는 각 스레드에 배리어 오브젝트 참조를 전달하고 호출해야합니다.
wait
(즉,barrier.await()
), 따라서. 다음과 같이 :기다려야하는 다른 스레드에도 동일한 프로세스를 수행하십시오. 당사자 수 (즉,
NUMBER_OF_PARIES
)는 장벽에서 대기해야하는 스레드 수와 일치합니다. 그렇지 않으면 교착 상태가 발생합니다. 이제 사용하고 있으므로cyclic barrier
예를 들어 코드의 일부를 정리할 수 있습니다. 예를 들어 필드와 관련된 모든 논리를 제거 할 수 있습니다.predecessor
의Logging
수업.스레드 2가 스레드 1에서 대기하도록하려면 CountDownLatch를 사용할 수 있습니다.
먼저
CountDownLatch
1 개만있는 개체 :스레드 2에 전달되고이 스레드가 스레드 1을 기다리도록하려면 다음을 호출하십시오.
block_thread2.await();
그리고 스레드 1 :
따라서이 대기 스레드 2는 스레드 1을 기다리지 만 스레드 1은 스레드 2를 기다리지 않습니다.