Вы должны отделить реальные задачи, от того, как они выполняются. То есть не расширяйте Thread
и перезапишите run
, вместо этого выполните Runnable
как задачу и не заботитесь о том, как он выполняется.
Таким образом, вы можете проектировать (+ изменить позже) способ выполнения задач независимо от фактической реализации задачи.
E.g. Вызовите каждый из .run()
непосредственно, если вы хотите выполнить их после друг друга или позволить некоторым Executor
обрабатывать их или даже запускать их через new Thread
вручную.
Если им нужно подождать друг на друга, вы также можете использовать Future
. Например:
class ProcessingChainElement implements Callable<String> {
private final Future<String> previous;
public ProcessingChainElement(Future<String> previousResult) {
previous = previousResult;
}
@Override
public String call() throws Exception {
// prepare something that may take some time but does not depend on
// any previous result
Thread.sleep(500);
// get result from previous task, this blocks until it is available
result = previous.get() + " [" + System.currentTimeMillis() + "]";
return result;
}
}
И постройте цепочку задач, которые могут быть выполнены любым возможным способом.
ExecutorService executor = Executors.newFixedThreadPool(3);
Future<String> result1 = executor.submit(...
Future<String> result2 = executor.submit(new ProcessingChainElement(result1));
...
Результат является то, что каждая из них может ждать результатов предыдущей задачи, но может очень хорошо работать параллельно, если есть что-то, что может работать параллельно.
Пример http://ideone.com/VAg8q3 показывает, что 3 задачи, которые занимают> = 500 мс каждый и зависят друг от друга, могут выполняться намного быстрее, чем их выполнение в последовательности.
Как насчет запуска вашего материала в одном потоке? – keyser
Не могли бы вы прояснить свой вопрос? На данный момент для меня вопрос заключается в том, чего вы хотите достичь с этим. –
Под «потоками» вы, вероятно, имеете в виду «задачи». Если нет, то это искусственный вопрос о поведении, которое вы никогда не захотите появляться в функциональном приложении. –