Как насчет этого решения?
Он не использует класс Thread, но он является параллельным и в некотором смысле делает именно то, что вы запрашиваете.
ExecutorService pool = Executors.newFixedThreadPool(2);
Future<Integer> value = pool.submit(new Callable<Integer>() {
@Override
public Integer call() {return 2;}
});
Теперь все, что вы делаете, это говорите value.get()всякий раз, когда вам нужно получить возвращаемое значение, поток запускается в ту самую секунду, когда вы задаете valueзначение, поэтому вам никогда не придется об этом говорить threadName.start().
Что Futureесть, это обещание программе, вы обещаете программе, что вы получите то значение, которое ей нужно, когда-нибудь в ближайшем будущем.
Если вы вызовете .get()его до того, как это будет сделано, вызывающий его поток просто подождет, пока он не будет выполнен.