ユーザーが Application にログインするたびに、基本的にこれを行う WebApplication 内に以下のコードがあります。
- addSymbols メソッドは、ユーザーのログオン操作中に呼び出されます。
- 上記の結果として、PriorityBlockingQueue が起動されます
- PriorityBlockingQueue はシンボルを HashSet に追加します。これは、新しく追加されたシンボルに対して特定のタスクを実行するために繰り返されます。
ここで直面している問題は、HashSet の一部である while ループが、Thread の while true 条件内にあるため、同じタスクを何度も実行していることです。
それに関連するコンテキストを理解するために、サンプル出力を貼り付けています。
Symbol From priorityBlocking SymbolTest
Symbol From allSymbolsSet SymbolTest
Symbol From allSymbolsSet SymbolTest
Symbol From allSymbolsSet SymbolTest
Symbol From allSymbolsSet SymbolTest
Symbol From allSymbolsSet SymbolTest
Symbol From allSymbolsSet SymbolTest
Symbol From allSymbolsSet SymbolTest
Symbol From allSymbolsSet SymbolTest
Symbol From allSymbolsSet SymbolTest
Symbol From allSymbolsSet SymbolTest
これは、上記のことを行う私のコードです。
package com;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.PriorityBlockingQueue;
public class TaskerThread extends Thread {
private PriorityBlockingQueue<String> priorityBlocking = new PriorityBlockingQueue<String>();
private Set<String> allSymbolsSet = new HashSet<String>();
ExecutorService es = Executors.newFixedThreadPool(2);
public void addSymbols(String str) {
if (str != null) {
priorityBlocking.add(str);
}
}
public void run() {
while (true) {
try {
while (priorityBlocking.peek() != null) {
String symbol = priorityBlocking.poll();
allSymbolsSet.add(symbol);
try {
System.out.println("Symbol From priorityBlocking" +" "+ symbol);
} catch (Exception e) {
e.printStackTrace();
}
}
Iterator<String> ite = allSymbolsSet.iterator();
while (ite.hasNext()) {
String symbol = ite.next();
if (symbol != null && symbol.trim().length() > 0) {
try {
System.out.println("Symbol From allSymbolsSet"+" "+symbol);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String args[]) {
try {
TaskerThread qT = new TaskerThread();
qT.start();
qT.addSymbols("SymbolTest");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Iterator タスクを 1 回だけ実行する方法があれば教えてください。