Вы можете добавить метод getThread()
к MyRunnable
, который создает Thread
, выполняющий метод run()
.
Я бы предложил добавить переменную экземпляра следующим образом (для обеспечения правильности volatile ):
private volatile Thread myThread;
Сделайте это до блока try
:
myThread = Thread.currentThread();
И добавить finally
блок с этим:
myThread = null;
Тогда вы можете позвонить:
final Thread theThread = myRunnable.getThread();
if (theThread != null) {
System.out.println(theThread.getState());
}
для некоторых MyRunnable
.
null
- это неоднозначный результат на данном этапе, означающий либо «не выполнено», либо «выполнено». Просто добавьте метод, который сообщает, завершена ли операция:
public boolean isDone() {
return done;
}
Конечно, вам понадобится переменная экземпляра для записи этого состояния:
private volatile boolean done;
И установите для него значение true в блоке finally
(вероятно, до установки потока в null
, там есть некоторое состояние гонки, потому что есть два значения, фиксирующие состояние одной вещи. В частности, с этим подход, который вы могли бы наблюдать isDone() == true
и getThread() != null
. Вы могли бы смягчить это, имея объект lock
для переходов состояний и синхронизировать его при изменении одной или обеих переменных состояния):
done = true;
Обратите внимание, что до сих пор нет охранника, который запрещает одновременную отправку одного MyRunnable
двум или более потокам. Я знаю, вы говорите, что вы не делаете этого ... сегодня :) Многократные одновременные выполнения приведут к поврежденному состоянию с высокой вероятностью. Вы могли бы установить некоторую взаимную исключительную защиту (например, просто написав synchronized
в методе run()
) в начале метода run, чтобы гарантировать, что в любой момент времени выполняется только одно выполнение.