如何在java中停止2个线程,我的请求是您创建2个线程并运行它们,但一分钟后需要停止一个线程,2分钟后需要停止第二个线程。任何人都可以让我知道如何通过只使用一个变量来做到这一点。java中的多线程停止
回答
使用您开始之前加载以毫秒当前时间
volatile long startTime = System.currentTimeMillis();
在你的线程run
方法或final长变量检查车况
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()
调用的结果是不安全的。即使线程的事件以可预测的顺序发生,纳秒的差异可以是正数也可以是负数,而线程之间的使用可以安全使用。
是的,这实际上是更高效,更简单:) –
'长'currentTimeMillis而不是'int'请。由于没有变化,'volatile'也可以用'final'代替。 'nanoTime()'是单调的(就像'currentTimeMillis()'),所以它可以用来测量或测试一个持续时间。 'nanoTime()'唯一的怪癖:它是一个独立的时钟,所以它只能用来测量持续时间,但不能获得绝对时间。 –
@MarkusKull我完全同意你的前两个更正,但是即使使用一个变量('startTime')初始化并使用'nanoTime()'检查可以在这里使用(因为漂移小于millisecs),它不是线程安全(这就是为什么它是一个附注) –
那么这取决于你的线程正在做什么。如果线程执行一个无限循环,我想你可以使用一个标志来检测循环是否应该停止。
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
}
}
}
isRunning必须是'volatile' –
像这样的东西可能会奏效
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
}
- 1. Java,停止(中断)线程
- 2. 在Java中停止线程?
- 3. Java多线程,如何停止?
- 4. Java线程意外停止
- 5. Java线程不会停止
- 6. 如何停止Java线程?
- 7. 停止线程onclicklistener java
- 8. 如何停止Java中的线程?
- 9. tKinter多线程停止线程
- 10. Java多线程停止所有其他线程立即
- 11. 如何在Java中停止线程
- 12. Java中,如何停止线程
- 13. 如何在Java中停止线程?
- 14. 停止或中断Java线程
- 15. 多线程处理和中途停止
- 16. Java中实际停止()线程的线程池?
- 17. 的Java停止服务器线程
- 18. Java的信号灯停止线程
- 19. Java的运行和停止线程
- 20. 停止python中的线程
- 21. 停止线程
- 22. 停止线程
- 23. 停止线程
- 24. 如何停止,暂停,取消java中的线程
- 25. Java线程突然停止运行
- 26. Java Tomcat,底层Netty线程不停止
- 27. 停止一个非循环Java线程
- 28. Android:停止线程
- 29. 停止MFC线程
- 30. 停止线程onPause
嗨拉米亚,你可以显示你已经尝试过(代码示例),你试图实现什么?看看我们的简短指南,提出很好的问题:stackoverflow.com/help/how-to-ask – dubes
任何发布的答案,迄今为止省略等待完成的线程。只是因为一个线程已经被告知完成,并不意味着它立即“完成”。 –