单独运行一个类实例作为一个线程

时间:2012-02-23 02:23:21

标签: java multithreading concurrency timer

我有这段代码:

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

如何将自己的代码作为一个线程单独启动?我是否需要将计时器和Timeout传递给Runnable然后启动它?如果线程的Run()在定时器被触发之前结束会发生什么?

我正在考虑这样做:

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

但是如何在超时后退出线程?一段时间后我用完了线程

由于

1 个答案:

答案 0 :(得分: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();

join方法将阻塞线程,直到超时任务完成执行。那时你可以关闭Timer。然而,这是很多线程创建,以及IMO糟糕的编程。

创建Timer实例时,会创建一个线程来执行Timeout#run()方法。计时器有自己的run方法,直到你的任务准备好执行为止。在给定的超时时间过去之后,计时器解除阻塞并执行超时。

您的TimeoutRunner线程将阻塞,直到超时操作完成。只有这样,这个线程才会死亡。

Timer类非常有限。您需要为每个任务创建一个新实例。在我的选项中,ScheduledExecutorService是一个更好的选择。只要您计划执行任务,就保持ScheduledExecutorService处于打开状态。如果您需要类似计划的缓存线程池,请随意使用我的一个开源项目(Scheduler)中的此类。这适用于缓存的线程池。