我正在写一个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,我的代码错了。我使用错误的名称作为布尔值,抱歉。现在已经修好了。答案 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来处理这个问题(例如,锁存器)。