Уникальная идентификация прерванного потока в JAVA - PullRequest
0 голосов
/ 26 февраля 2020

Допустим, у меня есть список с именем USERS, который содержит USER1 и USER2. Максимальное количество потоков за один раз может быть размером ПОЛЬЗОВАТЕЛЕЙ. В этом случае 2. И созданные потоки будут иметь то же имя, что и пользователь

У меня есть другой список, который содержит некоторые значения. В этом случае, скажем, у нас есть

List<String> values = new ArrayList<>();
values.add("A");values.add("B");values.add("C");values.add("D");

USER1 и USER2 должны выбрать данные из «значений».

Итак, мы запускаем потоки, и максимальное количество потоков может быть размер ПОЛЬЗОВАТЕЛЕЙ, равный 2.

Мы запускаем два потока и присваиваем им первые два значения из списка «значений».

Итак, на данный момент USER1 - имеет -> A и USER2 - имеет -> B.

Теперь поток USER2 завершается, а USER1 все еще работает.

По окончании USER2. И мне снова нужно создать новый поток для обработки оставшихся данных из «значений».

Итак, как мне узнать, что поток USER2 завершен, и создать новый поток с именем USER2.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

откуда мне знать, что поток 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 . Используйте это в своей программе и примените свои собственные логи c,

public static void main(String[] args) {
    Listener l = new Listener();
    MyThread t = new MyThread(l);
    t.setName("MyThread");
    t.start();
}

Вывод,

Выполнение MyThreadstarting.

MyThread завершил выполнение (через 1,5 секунды)

0 голосов
/ 26 февраля 2020

Прежде всего, вы используете BlockingQueue, а не список.

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

Затем вы запускаете по одному потоку для каждого потребителя (ie в вашем случае), принимая элементы из очереди пока он не станет пустым.

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) {}
    });
}

Теперь вы отправите число потоков, равное количеству пользователей, каждый из которых будет продолжать отбирать элементы из очереди и передавать их соответствующему пользователю, пока ни один из них не будет осталось в очереди.

...