2016-03-08 68 views
1

如何在java中停止2个线程,我的请求是您创建2个线程并运行它们,但一分钟后需要停止一个线程,2分钟后需要停止第二个线程。任何人都可以让我知道如何通过只使用一个变量来做到这一点。java中的多线程停止

+0

嗨拉米亚,你可以显示你已经尝试过(代码示例),你试图实现什么?看看我们的简短指南,提出很好的问题:stackoverflow.com/help/how-to-ask – dubes

+0

任何发布的答案,迄今为止省略等待完成的线程。只是因为一个线程已经被告知完成,并不意味着它立即“完成”。 –

回答

1

使用您开始之前加载以毫秒当前时间

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*1000threadRun = 2 * 60 * 1000为第一,分别是第二个线程。

一个侧面说明,比较不同线程间System.nanoTime()调用的结果是不安全的。即使线程的事件以可预测的顺序发生,纳秒的差异可以是正数也可以是负数,而线程之间的使用可以安全使用。

+0

是的,这实际上是更高效,更简单:) –

+0

'长'currentTimeMillis而不是'int'请。由于没有变化,'volatile'也可以用'final'代替。 'nanoTime()'是单调的(就像'currentTimeMillis()'),所以它可以用来测量或测试一个持续时间。 'nanoTime()'唯一的怪癖:它是一个独立的时钟,所以它只能用来测量持续时间,但不能获得绝对时间。 –

+0

@MarkusKull我完全同意你的前两个更正,但是即使使用一个变量('startTime')初始化并使用'nanoTime()'检查可以在这里使用(因为漂移小于mi​​llisecs),它不是线程安全(这就是为什么它是一个附注) –

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 
    } 
    } 
} 
+0

isRunning必须是'volatile' –

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 
} 
+0

是的,使用中断是最可读的解决方案IMO – idelvall

+0

您好@fsociety,有没有可能我们可以在主线程中使用上述逻辑并检查时间并调用t1.interrupt和t2。打断。感谢您的有用答案。 –

+0

@Ramya B第一个代码段可以进入你的主线程。基本上主线程将创建3个线程;你的两个线程和一个线程来触发中断。如果你发现它对你有帮助,你可以对答案进行投票:) – fsociety