Я не совсем уверен, что вы просите, но я дам ему выстрелили.
Как я могу запустить следующий фрагмент кода как нить сам по себе?
Короче ...
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 будет блокироваться до завершения операции таймаута. Только тогда эта нить может погибнуть.
Класс таймера очень ограничен. Вам нужно создать новый экземпляр для каждой задачи. По моему варианту, ScheduledExecutorService - лучший вариант. Хранить службу ScheduledExecutorService до тех пор, пока вы планируете выполнять задачи. Если вам нужно что-то вроде запланированного пула кешированных потоков, не стесняйтесь использовать этот класс из одного из моих проектов с открытым исходным кодом (Scheduler). Это отлично работает с кэшированным пулом потоков.
Этот вопрос не имеет для меня никакого смысла. – erickson