在JAVA中唯一标识终止的线程

在JAVA中唯一标识终止的线程,java,multithreading,threadpoolexecutor,Java,Multithreading,Threadpoolexecutor,假设我有一个名为USERS的列表,其中包含USER1和USER2。 一次的最大线程数可以是用户的大小。在本例中为2。 创建的线程将与用户同名 我有另一个列表,其中包含一些值。在这种情况下,假设我们有 List<String> values = new ArrayList<>(); values.add("A");values.add("B");values.add("C");values.add("D"); List values=new ArrayList(); 价值

假设我有一个名为USERS的列表,其中包含USER1和USER2。 一次的最大线程数可以是用户的大小。在本例中为2。 创建的线程将与用户同名

我有另一个列表,其中包含一些值。在这种情况下,假设我们有

List<String> values = new ArrayList<>();
values.add("A");values.add("B");values.add("C");values.add("D");
List values=new ArrayList();
价值。添加(“A”);价值。添加(“B”);价值。添加(“C”);价值。添加(“D”);
USER1和USER2必须从“值”中选择数据

因此我们启动线程,线程的最大数量可以是用户的大小,即2

我们启动两个线程,并从“值”列表中为它们分配前两个值

因此,到目前为止,USER1--具有-->A,USER2--具有-->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已完成执行(1.5秒后)

首先,您使用的是
阻塞队列而不是列表

BlockingQueue<String> queue = new ArrayBlockingQueue<>(list.size(), true, list);

现在您已经提交了相当于用户数量的线程,每个线程将不断从队列中获取项目并将其交给相应的用户,直到队列中没有剩余任务。

创建一个池,其中包含用户智能任务状态和一些自动生成的id,就像日志一样,包含进程中的状态,并在每个线程执行之前和之后完成。谢谢,Themelis给出了答案,但我不认为您解决了我的问题。打印完成的用户是为我们准备的。问题是我想让代码知道哪个用户已经完成了任务,这样我需要创建的下一个线程来选择另一个“值”将是“USER2”的名称。
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) {}
    });
}