如何在java中停止2个线程,我的req是你创建2个线程并运行它们,但是一分钟之后你需要停止一个线程,2分钟之后你需要停止第二个线程。任何人都可以通过只使用一个变量让我知道如何做到这一点。
答案 0 :(得分:1)
使用在加载当前时间之前加载的volatile或final长变量,以毫秒为单位
volatile long startTime = System.currentTimeMillis();
在你的主题run
方法中检查条件
public void run(){
while (System.currentTimeMillis()-startTime < threadRun){
//...do something
//or simulate work by Thread.sleep()
}
//The thread will shutdown when it exits the while loop
}
首先使用threadRun = 60*1000
和threadRun = 2 * 60 * 1000
作为第二个帖子。
侧面说明,比较不同线程之间System.nanoTime()
次调用的结果是不安全的。即使线程的事件以可预测的顺序发生,纳秒的差异也可以是正的或负的,而System.currentTimeMillis()
在线程之间使用是安全的。
答案 1 :(得分:1)
这样的事情可能会起作用
t1.start();
t2.start();
new Thread(){
public void run(){
Thread.sleep(1000*60);
t1.interrupt();
Thread.sleep(1000*60);
t2.interrupt();
}
}.start();
您基本上创建了一个新线程,分别在1分钟和2分钟后触发中断。现在您需要做的就是捕获线程中的中断并从中返回。
您可以执行以下操作来检测2个线程中的中断。
public void run()
{
try
{
while (!interrupted() && more work to do)
{
//do more work
}
}
catch(InterruptedException exception)
{
// thread was interrupted during sleep or wait
}
finally
{
//cleanup, if required
}
// exit run method and terminate thread
}
答案 2 :(得分:0)
这取决于你的线程正在做什么。如果线程执行无限循环,我想你可以使用一个标志来检测是否应该停止循环。
public class MyRunnable implements Runnable {
ScheduledExecutorService scheduledStop = Executors.newScheduledThreadPool(1);
boolean isRunning;
int stopDelay;
public MyRunnable(int duration) {
stopDelay = duration;
}
@Override
public void run() {
scheduledStop.schedule(new Runnable() {
@Override
public void run() {
isRunning = false;
}
}, stopDelay, TimeUnit.MINUTES);
while (isRunning) {
//do something
}
}
}