Я не совсем уверен, что вы спрашиваете, но я сделаю это.
Как я могу запустить следующий фрагмент кода как поток сам по себе?
Короче ...
Timeout.java
public class Timeout extends TimerTask {
boolean isDone = false;
@Override
public void run() {
// TODO something
synchronized(this) {
isDone=true;
this.notifyAll();
}
}
public synchronized void join() throws InterruptedException {
while(!this.isDone)
this.wait();
}
}
TimeoutRunner.java
public class TimerRunner implements Runnable {
@Override
public void run() {
Timeout timeout = new Timeout();
Timer timer = new Timer();
timer.schedule(timeout, 1000L);
try {
timeout.join();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
timer.cancel();
}
}
}
Запустите TimeoutRunner, используя:
new Thread(new TimeoutRunner()).start();
Метод объединения блокирует поток до тех пор, пока задача тайм-аута не завершит выполнение.В это время вы можете закрыть таймер.Это, однако, требует много создания потоков и плохого программирования IMO.
Когда вы создаете экземпляр Timer, создается поток для выполнения метода Timeout # run ().Таймер имеет свой собственный метод запуска, который блокирует, пока ваша задача не будет готова к выполнению.По истечении заданного времени ожидания таймер разблокируется и выполняет ваше время ожидания.
Ваш поток TimeoutRunner будет блокироваться до завершения операции тайм-аута.Только тогда этот поток может умереть.
Класс Timer очень ограничен.Вам нужно создать новый экземпляр для каждой задачи.В моем варианте ScheduledExecutorService является лучшим вариантом.Держите ScheduledExecutorService открытым до тех пор, пока вы планируете выполнять задачи.Если вам нужно что-то вроде запланированного пула кэшированных потоков, не стесняйтесь использовать этот класс из одного из моих проектов с открытым исходным кодом ( Scheduler ).Это прекрасно работает с кэшированным пулом потоков.