Вместо того, чтобы использовать какую-то явную блокировку, я бы предложил вам использовать очередь блокировки . Преимущество, которое я вижу, состоит в том, что вам не нужно будет повторно создавать поток, если / когда это необходимо. Вам нужно будет создать поток только один раз, который будет обрабатывать только все doSomething .
Сценарий:
Когда вызывается methodA , он помещает необходимую информацию для вашего выделенного потока в BlockingQueue и продолжает работу. Выделенный поток будет опрашивать информацию из BlockingQueue (блокировка в пустой очереди). Когда некоторая информация поступает в очередь, она запускает ваш метод doSomething .
BlockingQueue<Info> queue;
methodA() {
//...
queue.add(info);
// non-blocking, keeps going
}
void dedicatedThread(){
for(;;) {
//Blocks until some work is put in the queue
Info info = queue.poll();
doSomething(info);
}
}
Примечание: Я предположил, что тип Info содержит необходимую информацию для метода doSomething . Однако, если вам не нужно делиться какой-либо информацией, я бы предложил вам использовать вместо этого семафор. В этом случае methodA поместит заявки в семафор, а выделенный поток попытается нарисовать билеты, блокируя их до тех пор, пока не будут получены некоторые билеты.