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打开。如果您需要一个调度的缓存线程池,可以从我的一个开源项目()中使用这个类。这在缓存线程池中非常有效。这个问题对我来说没有任何意义。