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