複数のスレッドが自分自身を登録するマネージャクラスがあります(要求ごとに一意の識別子を生成するために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();
}
}
}
functionality-私のマネージャーをテストするための実装は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ループを連続的にループすることによってスレッドがあまりにも多くの作業をしています。
マネージャにリクエストを送信した後にスレッドをスリープさせる方法です。マネージャは、レスポンスの準備ができたらこのスレッドに信号を送ります。
私はこれが誰かにはあまりにも単純な音なら、私はjavaとjava-threadingインターフェイスの初心者です。
'executor.isTerminated()'の代わりに 'ExecutorService.awaitTermination'メソッドを使用してください。詳細については、ExecutorServiceのjavadocを参照してください。 –