java中的多线程停止

时间:2016-03-08 07:23:05

标签: java multithreading

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

3 个答案:

答案 0 :(得分:1)

使用在加载当前时间之前加载的volatilefinal长变量,以毫秒为单位

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*1000threadRun = 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
    }
    }
}