Java线程 - 阻止线程通过另一个进行方法调用的线程运行

时间:2012-03-25 19:27:39

标签: java multithreading synchronized

我正在写一个Runnable类。在其中,我有两种方法。 run()方法和另一个名为stopRunning()的方法。 stopRunning()将由运行run()方法的单独线程调用,并且停止运行run()方法的线程运行。

以下是代码段:

public class myRunnable implements Runnable
{
    private boolean stillRunning = true;

    public void stopRunning()
    {
        synchronized (this)
        {
           stillRunning = false;
        }
    }

    public void run()
    {
       while (stillRunning)
       {
          synchronized (this)
          {
             // do some stuff that doesn't involve the isPlaying var
          }
       }
    }

}

此代码看起来是否正确?我是否需要同步以确保运行run()方法的线程能够识别isPlaying的更改?

此外,我是否需要在此处的任何地方调用notify()或notifyAll()才能使用此功能?我很确定我没有,因为我从不打电话给wait(),但我不是百分百肯定。

编辑:woops,我的代码错了。我使用错误的名称作为布尔值,抱歉。现在已经修好了。

4 个答案:

答案 0 :(得分:3)

对于启动和停止线程,Java Thread API已经提供了您正在寻找的功能。 Thread.interrupt()Thread.interrupted()可用于实现您的目标。

public class MyThread extends Thread{
  public void run(){
    while(!interrupted()){
      try{
        // Place your code here
      }catch(InterruptedException e){
        break;
      }
    }
  }
}

每当您想要中断MyThread时,只需致电MyThread.interrupt()

答案 1 :(得分:1)

这样做很好,一个更简单的替代方案,如果您添加更多功能,以后不会导致同步问题,只需将sillRunning声明为volatile

正如你所说,nofity()只会与wait结合使用。它与你在这里所做的事无关。

答案 2 :(得分:1)

你应该将stillRunning声明为像这样的

这样的volatile变量
public class OurThread extends Thread(){
  private volatile boolean stop = false;
  public void run(){
    while (!stop) {
    //Do your actions
    }
  }
}

点击此链接http://www.asjava.com/core-java/three-ways-to-stop-java-thread/

还要查看有关易变变量http://www.javamex.com/tutorials/synchronization_volatile.shtml

的链接

答案 3 :(得分:0)

为了可靠性,您需要对'stillRunning'变量应用一些MT保护。你可以像其他人所说的那样使这种变化。或者,您可以将其包装在同步块中。如果除了设置/检查'stillRunning'之外还需要进行其他操作,这可能很有用。

请注意,如果没有MT保护,您的代码可能似乎适用于不在高负载下运行的单元测试。但它在生产环境中不可靠。

关于你对notify()的评论,notifyAll();这用于唤醒被阻塞的线程并发出信号表明它继续检查状态。您的示例似乎不需要这样做。现在,notify()/ wait()被认为是相当低级别的,并且Java有一些线程API来处理这个问题(例如,锁存器)。