簡體   English   中英

JAVA中唯一標識終止線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM