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

Java线程-通过另一个线程进行方法调用来停止线程运行,java,multithreading,synchronized,Java,Multithreading,Synchronized,我正在写一个可运行的类。在它里面,我有两种方法。run()方法和另一个名为stopRunning()的方法。stopRunning()由运行run()方法的线程之外的单独线程调用,用于停止运行run()方法的线程的运行 下面是一段代码片段: public class myRunnable implements Runnable { private boolean stillRunning = true; public void stopRunning() {

我正在写一个可运行的类。在它里面,我有两种方法。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()方法的线程能够识别isplay的更改

此外,我是否需要在此处的任何位置调用notify()或notifyAll(),才能使其正常工作?我很确定我没有,因为我从未调用wait(),但我不是100%确定


编辑:哇,我的代码错了。我用错了布尔值的名称,很抱歉。它现在已经修复。

效果很好,一个更简单的替代方法是简单地声明
sillRunning
volatile
,如果添加更多功能,以后不会给您带来同步问题


正如您所说,nofity()只做与wait结合使用时有用的事情。这与您在这里所做的事情无关。

这很好,一个更简单的选择,如果您添加更多功能,以后不会给您带来同步问题,就是简单地声明
sillRunning
volatile


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

您应该声明stillRunning是一个易失性变量,如下所示

public class OurThread extends Thread(){
  private volatile boolean stop = false;
  public void run(){
    while (!stop) {
    //Do your actions
    }
  }
}
检查此链接


另外,请检查此有关易失性变量的链接

您应该将stillRunning声明为类似以下的易失性变量

public class OurThread extends Thread(){
  private volatile boolean stop = false;
  public void run(){
    while (!stop) {
    //Do your actions
    }
  }
}
检查此链接


还可以查看关于volatile variables的链接

有关启动和停止线程的信息,Java已经提供了您需要的功能
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()

启动和停止线程,Java已经提供了您想要的功能
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()

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

请注意,如果没有MT保护,您的代码可能会在诸如单元测试之类的情况下工作,而单元测试不会在重载下运行。但它在生产环境中并不可靠


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

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

请注意,如果没有MT保护,您的代码可能会在诸如单元测试之类的情况下工作,而单元测试不会在重载下运行。但它在生产环境中并不可靠


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

您打算声明成员isplay与isRunning吗?是的,很抱歉造成混淆。我刚刚更改了它。你打算宣布会员isplay vs.isRunning吗?是的,很抱歉混淆了。我刚改了。对不起,什么是MT保护?对不起,什么是MT保护?