Я использую 2 пула потоков, каждый для разностной цели (их цели не имеют значения для этого вопроса). Бассейны созданы из одной и той же исходной нити следующим образом:Выполняют ли исполнители тему, из которой они были созданы?
private ScheduledExecutorService pool1
= Executors.newCachedThreadPool(new ManagerFactory(group, "Cached"));
private ExecutorService pool2
= Executors.newScheduledThreadPool(3, new ManagerFactory(group, "Scheduled"));
ManagerFactory
класс:
private class ManagerFactory implements ThreadFactory {
private final ThreadGroup group;
private final String name;
private ManagerFactory(ThreadGroup group, String name) {
this.group = group;
this.name = name;
}
@Override
public Thread newThread(Runnable r) {
final Thread t = new Thread(group, r);
t.setName(name + " Manager Thread");
return t;
}
}
- Когда эти пулы потоков создаются, будут ли они когда-либо использовать нить они были созданы для выполнения поставленной задачи?
- Если ответ на это не так, есть ли задержка при отправке новой задачи, которая должна быть выполнена?
Под этим я имею в виду не задержку перед выполнением задачи, так как я знаю, что планировщики не могут гарантировать, когда задача будет выполнена. Чтобы лучше прояснить это, обратитесь к следующему примеру: Я отправляю задание на EDT. Будет ли EDT повесить вообще, пока задача будет отправлена? - Как вы узнаете, какой из
ExecutorServices
будет использовать вызывающий поток, а какой нет?
простые вопросы: 1. нет 2. да – jtahlborn
1 на самом деле * возможно *, но только если вы используете Исполнителя с помощью «ThreadPoolExecutor.CallerRunsPolicy». –
EDT, в цикле, принимает задачи из своей очереди и затем выполняет их. Доступ к очереди синхронизирован. Если EDT выполняет задачу точно, когда другая задача отправляется другим потоком, EDT (или этот поток) ждет незначительный период времени. –