여러 스레드가 스스로 등록하는 Manager 클래스가 있습니다 (요청 당 고유 식별자를 생성하기 위해 UUID
사용). 페이로드가 처리하고 해당 응답을 매니저. java.util.concurrent.ExecutorService
을 사용하여 여러 스레드를 시작합니다. 여기에 여기에 Java ExecutorService : - 이벤트가 발생할 때 깨어나도록 스레드에 알립니다.
public class ManagerTest {
public static void main(String[] args) {
try {
Manager myManager = new Manager();
// Start listening to the messages from different threads
myManager.consumeMessages();
int num_threads = Integer.parseInt(args[0]);
ExecutorService executor = Executors.newFixedThreadPool(num_threads);
for (int i = 0; i < num_threads; i++) {
// class implementation is given below
Runnable worker = new MyRunnable(myManager);
executor.execute(worker);
}
executor.shutdown();
// Wait until all threads are finish
while (!executor.isTerminated()) {
}
System.out.println("\nFinished all threads");
myManager.closeConnection();
} catch (IOException | TimeoutException e) {
e.printStackTrace();
}
}
}
많은 기능을 내 관리자를 테스트 할 수있는 구현은
MyRunnable
클래스의 구현입니다
class MyRunnable implements Runnable {
private Manager managerObj;
public MyRunnable(Manager managerObj) {
this.managerObj = managerObj;
}
@Override
public void run() {
try {
Random rand = new Random();
int n = rand.nextInt(35);
String requestId = UUID.randomUUID().toString();
managerObj.registerRequest(requestId, n);
managerObj.publishMessage(requestId);
// Want to avoid this while loop
while(! managerObj.getRequestStatus(requestId)){
}
int response = managerObj.getRequestResponse(requestId);
// do something else
managerObj.unregisterRequest(requestId);
} catch (IOException e) {
e.printStackTrace();
}
}
}
요청과 페이로드에 양을 변화 걸릴 수 있습니다 요청의 응답을 따라 처리합니다 관리자 시간. 관리자가 응답을받을 때마다이 함수를 호출하여 요청 상태를 true로 설정합니다. setRequestStatus(requestId)
. 이 후에 스레드는 while loop
에서 빠져 나와 실행을 계속합니다.
코드가 정상적으로 작동하지만 스레드가 너무 많은 작업을 수행하면 조건이 충족 될 때까지 while 루프를 반복적으로 반복해야합니다.
관리자에게 요청을 보낸 후 스레드를 잠자기 상태로 만드는 방법이며 관리자가 응답을 준비 할 때이 스레드에 신호를 보냅니다.
만약 누군가에게 너무 간단하다면, 나는 자바와 자바 스레딩 인터페이스에 초보자입니다.
대신'executor.isTerminated()'의'ExecutorService.awaitTermination' 방법을 사용합니다. 자세한 것은, ExecutorService의 javadoc를 참조 해주세요. –