Java 将类实例本身作为线程运行

Java 将类实例本身作为线程运行,java,multithreading,concurrency,timer,Java,Multithreading,Concurrency,Timer,我有一段代码: Timeout s = new Timeout(); Timer timer = new Timer(); timer.schedule(s, 1000L); // fires after 1 second 如何将下面的代码作为线程单独启动?我是否需要将计时器和超时传递给Runnable,然后启动它?如果线程的Run()在计时器启动之前结束,会发生什么情况 我正在考虑这样做: ScheduledExecutorService ses = Executors.newSchedul

我有一段代码:

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);
但超时后如何退出线程?过了一会儿,我的线用完了


谢谢

我不太清楚你在问什么,但我会试一试

如何将下面的代码作为线程单独启动

简言之

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方法将阻塞线程,直到超时任务完成执行。此时,您可以关闭计时器。然而,这是大量的线程创建,而且编程很糟糕

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

TimeoutRunner线程将阻塞,直到超时操作完成。只有这样,这根线才能死


计时器类非常有限。您需要为每个任务创建一个新实例。在我的选择中,ScheduledExecutorService是一个更好的选择。只要计划执行任务,就保持ScheduledExecutorService打开。如果您需要一个调度的缓存线程池,可以从我的一个开源项目()中使用这个类。这在缓存线程池中非常有效。

这个问题对我来说没有任何意义。