Запустите экземпляр класса как поток самостоятельно - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть этот фрагмент кода:

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);

но как мне выйти из потока после истечения времени ожидания?Через некоторое время у меня кончилась нить

Спасибо

1 Ответ

2 голосов
/ 23 февраля 2012

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

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

Короче ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...