2012-02-23 2 views
0

У меня есть этот кусок кода:Запуск экземпляра класса как нить сама по себе

Timeout s = new Timeout(); 
Timer timer = new Timer(); 
timer.schedule(s, 1000L); // fires after 1 second 

Как я могу запустить следующий фрагмент кода как нить сам по себе? Должен ли я передать таймер и тайм-аут на Runnable, а затем запустить его? Что произойдет, если поток Run() заканчивается перед запуском таймера?

Я имею в виду сделать это вместо того, чтобы:

ScheduledExecutorService ses = Executors.newScheduledThreadPool(1); 
     Timeout s = new Timeout(); // Timeout is a runnable 
     ses.schedule(s, 10, TimeUnit.SECONDS); 

но как выйти нить после тайм-аута? Я бегу из нити через некоторое время

Спасибо

+0

Этот вопрос не имеет для меня никакого смысла. – erickson

ответ

2

Я не совсем уверен, что вы просите, но я дам ему выстрелили.

Как я могу запустить следующий фрагмент кода как нить сам по себе?

Короче ...

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). Это отлично работает с кэшированным пулом потоков.

Смежные вопросы