Как Java ThreadPoolExecutor использует пользовательский ThreadFactory? - PullRequest
0 голосов
/ 27 марта 2012

Класс ThreadPoolExecutor позволяет предоставить пользовательский ThreadFactory для создания новых потоков.Тем не менее, я не понимаю, как эти потоки используются в реализации Sun ThreadPoolExecutor.

Эта реализация создает новый поток следующим образом:

private Thread addThread(Runnable firstTask) {
    Worker w = new Worker(firstTask);
    Thread t = threadFactory.newThread(w);
    if (t != null) {
        w.thread = t;
    ...
    } ...

Но в реализации Worker я не вижу, какполе "поток" используется в качестве бегуна.

Кроме того, я не понимаю, как можно обеспечить поток с пользовательским методом "запуска", которые используются повторно (если повторное использование - как в ThreadPoolExecutor - означает "они запускают несколько Runnable")«).Как ThreadPoolExecutor может повторно использовать такие потоки для запуска нескольких Runnable (при условии, что «target» Runnable в классе Thread установлен во время создания и нет установщика).Документация ThreadPoolExecutor выглядит следующим образом:

 By supplying a different ThreadFactory, you can alter the thread's name, thread group, priority, daemon status, etc.

Означает ли это, что метод "выполнения" потоков, созданный пользовательской ThreadFactory, не используется?Это единственный способ понять механизм «создание пользовательских потоков + повторное использование потока».

Ответы [ 2 ]

4 голосов
/ 27 марта 2012

Но в реализации Worker я не вижу, как поле "поток" используется в качестве бегуна.

Как говорится в документации newThread (), вновь созданный поток должен запускать Runnubleпредоставляется в качестве аргумента threadFactory.newThread (Runnuble).Вот как новый поток используется в качестве бегуна.

Кроме того, я не понимаю, как можно обеспечить поток с пользовательским методом "запуска", которые используются повторно

Опять же, метод запуска потока должен запустить предоставленный Runnable.run () один раз.Опрос потока предоставляет Worker, который выполняет задачи в цикле.Пример правильного пользовательского потока:

public class ThreadTL extends Thread {
    public ThreadTL(Runnable r) {
        super(r);
        setName(getName()+" DF "+executor.getClass().getSimpleName());
    }

    @Override
    public void run() {
        super.run();
    }
}
1 голос
/ 27 марта 2012

Один Runnable может вызвать другого.Переданный Runnable - это тот, который получает Runnables из очереди пулов потоков и запускает их.

...