我在我的 WebApplication 中有下面这段代码,每当用户登录到应用程序时,它基本上就是这样做的。
- addSymbols 方法将在用户登录操作期间被调用。
- 由于上述原因,PriorityBlockingQueue 被启动
- PriorityBlockingQueue 将该符号添加到 HashSet 中,然后对其进行迭代以在该新添加的符号上运行特定任务。
我在这里面临的问题是,作为 HashSet 一部分的 while 循环一遍又一遍地执行相同的任务,因为它处于线程的 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();
}
}
}
请让我知道是否有任何方法可以使迭代器任务只运行一次。