[英]Uniquely Identify the terminated thread in JAVA
假設我有一個名為 USERS 的列表,其中包含 USER1 和 USER2。 一次的最大線程數可以是 USERS 的大小。 在這種情況下 2.創建的線程將與用戶同名
我有另一個包含一些值的列表。 在這種情況下,假設我們有
List<String> values = new ArrayList<>();
values.add("A");values.add("B");values.add("C");values.add("D");
USER1 和 USER2 必須從“值”中選取數據。
所以我們啟動線程,最大線程數可以是USERS的大小,也就是2。
我們啟動兩個線程並將“值”列表中的前兩個值分配給它們。
所以到目前為止 USER1--has--> A 和 USER2--has--> B。
現在,USER2 線程完成,USER1 仍在運行。
由於 USER2 已經完成。 我再次需要創建一個新線程來處理“值”中的剩余數據。
那么我怎么知道 USER2 線程已經完成並創建一個名為 USER2 的新線程。
我怎么知道 USER2 線程已經完成
1 . 你需要你的線程向某人報告它的終止。 有人會是,
interface ThreadListener {
void onThreadTerminated(String threadName);
}
2 . 現在創建您的線程,例如當它終止時它會向ThreadListener
報告它的狀態。
class MyThread extends Thread {
private ThreadListener listener;
MyThread(ThreadListener listener) {
this.listener = listener;
}
public void run() {
System.out.println(getName() + " starting execution.");
doWork();
listener.onThreadTerminated(getName());
}
public void doWork(){
try {
Thread.sleep(1500);
} catch (Exception e) {}
}
}
3 . 最后,您需要線程狀態的利益相關者的具體實現,
class Listener implements ThreadListener {
public void onThreadTerminated(String threadName) {
System.out.println(threadName + " finished execution");
}
}
4 . 在你的程序中使用它並應用你自己的邏輯,
public static void main(String[] args) {
Listener l = new Listener();
MyThread t = new MyThread(l);
t.setName("MyThread");
t.start();
}
輸出,
MyThread 開始執行。
MyThread 完成執行(1.5 秒后)
首先,您使用BlockingQueue
而不是列表。
BlockingQueue<String> queue = new ArrayBlockingQueue<>(list.size(), true, list);
然后,您為每個消費者(即您的案例中的用戶)啟動一個線程,從隊列中取出項目,直到隊列為空。
ExecutorService executor = Executors.newThreadPoolExecutor(users.size());
for (final User user : users) {
executor.submit(() -> {
try {
while (!queue.isEmpty()) {
String item = queue.poll(1, TimeUnit.SECONDS);
if (item != null) {
user.handle(item);
}
}
} catch (InterruptedException x) {}
});
}
現在,您將提交與用戶數量相等的線程數,每個線程將繼續從隊列中取出項目並將其交給適當的用戶,直到隊列中沒有剩余。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.