実行メソッド内のステータスを更新しながら、コンシューマスレッドにgetStatus
メソッドを実装させて、ステータスをポーリングするクライアントからの呼び出しをリッスンします。消費者のスレッドについて、粗製の実装は、次のようになります。
public class ConsumerThread implements Runnable{
private int status = 0;
private Random rand = new Random();
private final CountDownLatch startSignal;
public ConsumerThread(CountDownLatch latch){
this.startSignal = latch;
}
public int getStatus() {
return status;
}
private void setStatus(int status) {
this.status = status;
}
public void run() {
try {
this.startSignal.await();
while (true){
this.setStatus(rand.nextInt(10));
}
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
次に簡単なmainメソッド(私が同時に始まるすべての私のスレッドを持っているCountDownLatchを実装し、それは必須ではありません)しよう:
を
public class ThreadMain{
private static List<ConsumerThread> consumers = new ArrayList<ConsumerThread>();
public static void main(String[] args) {
int NUM_THREAD = 15;
ExecutorService executor = Executors.newFixedThreadPool(NUM_THREAD);
CountDownLatch latch = new CountDownLatch(NUM_THREAD);
ConsumerThread buffer = new ConsumerThread(latch);
for (int i = 0; i < NUM_THREAD; i++){
consumers.add(buffer);
executor.execute(buffer);
latch.countDown();
buffer = new ConsumerThread(latch);
}
for (int i = 0; i < 100; i++){
System.out.println("Status for Thread 0: " + getStatusId(0));
System.out.println("Status for Thread 14: " + getStatusId(14));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static int getStatusId(int index){
return consumers.get(index).getStatus();
}
}
出力例:
Status for Thread 0: 5
Status for Thread 14: 0
Status for Thread 0: 7
Status for Thread 14: 2
Status for Thread 0: 7
Status for Thread 14: 4
Status for Thread 0: 6
Status for Thread 14: 3
あなたのクライアントを非同期に作成し、あなたの実際の問題を解決することができます。しかし、双方向サービス(例えば、リクエストがキューに入れられている、または応答が非常に長い時間がかかっているなど)を主張する場合は、クライアントに通知サービスを公開してサーバーの操作結果を受け取って、以前に送信された要求に対する応答通知。このシナリオでは、両端は技術的にクライアントとサーバーですが、クライアントをイニシエータにコールし続けます。 – acelent
私の問題にご関心をお寄せいただきありがとうございます。あなたが私に提案している2つのソリューションに関して、私は最初のソリューションを実装しました。 2番目はプロジェクトの別の反復の対象となります、この反復は研究と開発を構成します – FiokoSoft