停止线程onclicklistener java
如何正确停止或中断多服务器线程? 这是我的主程序的一部分,在这里我启动我的多服务器,但我想实现停止按钮,因为我的程序总是卡住,当我中断它。我可以在这里的主要部分吗?我应该使用哪个函数停止线程onclicklistener java,java,multithreading,Java,Multithreading,如何正确停止或中断多服务器线程? 这是我的主程序的一部分,在这里我启动我的多服务器,但我想实现停止按钮,因为我的程序总是卡住,当我中断它。我可以在这里的主要部分吗?我应该使用哪个函数 button.setOnClickListener(new View.OnClickListener() { //OnClickListener oclbutton=new OnClickListener(){ @Override public vo
button.setOnClickListener(new View.OnClickListener() {
//OnClickListener oclbutton=new OnClickListener(){
@Override
public void onClick(View v) {
tvOut.setText("Server Started");
Thread thread=new Thread (new MyServer());
thread.start();
}
});
//button.setOnClickListener(oclbutton);
//}
buttonStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//stop server
}
});
首先,您必须在
onClick
之外声明线程变量,以便能够从第二个侦听器访问它:
final Thread Thread=新线程(new MyServer())代码>
请注意final
修饰符:您正在匿名内部类中使用此变量,该类只能访问外部方法的final变量
现在,您的第一个onClick()
将启动线程
public void onClick(View v) {
tvOut.setText("Server Started");
thread.start();
}
现在,如何停止线程
您可以调用thread.stop()
。但由于各种原因,它的方法被弃用,这超出了本文讨论的范围。你可以在网上找到原因
那么,如何停止线程?这取决于它在做什么。您可以将isInterrupted()
检查到线程中,在本例中,您可以从第二个侦听器调用thread.interrupt()
。另一种方法是使用布尔标志和wait()-notify()
对
有很多关于线程的教程。读一些。如果还有不清楚的地方,请再次来到这里,提出更具体的问题。祝你好运,好好享受 首先,您必须在onClick
之外声明线程变量,才能从第二个侦听器访问它:
final Thread Thread=新线程(new MyServer())代码>
请注意final
修饰符:您正在匿名内部类中使用此变量,该类只能访问外部方法的final变量
现在,您的第一个onClick()
将启动线程
public void onClick(View v) {
tvOut.setText("Server Started");
thread.start();
}
现在,如何停止线程
您可以调用thread.stop()
。但由于各种原因,它的方法被弃用,这超出了本文讨论的范围。你可以在网上找到原因
那么,如何停止线程?这取决于它在做什么。您可以将isInterrupted()
检查到线程中,在本例中,您可以从第二个侦听器调用thread.interrupt()
。另一种方法是使用布尔标志和wait()-notify()
对
有很多关于线程的教程。读一些。如果还有不清楚的地方,请再次来到这里,提出更具体的问题。祝你好运,好好享受 如果要从不同的块访问线程,应该将其声明为所有方法或类都可以访问的字段或最终变量,而不是内部匿名类,类似这样
public void yourMethod() {
final Thread yourThread = null;
button.setOnClickListener(new View.OnClickListener() {
//OnClickListener oclbutton=new OnClickListener(){
@Override
public void onClick(View v) {
tvOut.setText("Server Started");
yourThread=new Thread (new MyServer());
thread.start();
}
});
buttonStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//stop server
yourThread.stop();
}
});
}
现在,请注意Thread.stop()方法已被弃用,因此您可以在MyServer类上执行以下操作,而不是进行该调用:
public class MyServer implements Runnable {
private boolean stopExecution = false;
public void setStopExecution(boolean stopExecution) {
this.stopExecution = stopExecution;
}
public void run() {
// as it is a server I assume you're doing a never ending loop
// now just make use of the control variable
while (!stopExecution) {
// do your stuff here...
}
}
}
在您的代码中,您要做的是:
公共方法(){
MyServer server=新的MyServer()
最后一种方法是避免监视器问题的正确方法。另外,请查看Executor类来管理线程。如果您想从不同的块访问线程,应该将其声明为所有方法或类都可以访问的字段或最终变量,而不是内部匿名类,类似这样的
public void yourMethod() {
final Thread yourThread = null;
button.setOnClickListener(new View.OnClickListener() {
//OnClickListener oclbutton=new OnClickListener(){
@Override
public void onClick(View v) {
tvOut.setText("Server Started");
yourThread=new Thread (new MyServer());
thread.start();
}
});
buttonStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//stop server
yourThread.stop();
}
});
}
现在,请注意Thread.stop()方法已被弃用,因此您可以在MyServer类上执行以下操作,而不是进行该调用:
public class MyServer implements Runnable {
private boolean stopExecution = false;
public void setStopExecution(boolean stopExecution) {
this.stopExecution = stopExecution;
}
public void run() {
// as it is a server I assume you're doing a never ending loop
// now just make use of the control variable
while (!stopExecution) {
// do your stuff here...
}
}
}
在您的代码中,您要做的是:
公共方法(){
MyServer server=新的MyServer()
最后一种方法是避免监视器出现问题的正确方法。还可以查看Executor类来管理线程。停止线程的一个好方法是使用标志正确退出run()方法:
如果myServer正在等待Thread.sleep(),您可以调用myServer.interrupt()取消睡眠。
如果myServer在I/O上阻塞,则会有点复杂:停止线程的一个好方法是使用标志正确退出run()方法:
如果myServer正在等待Thread.sleep(),您可以调用myServer.interrupt()取消睡眠。
如果myServer在I/O上阻塞,那么就有点复杂了:您不能在click listener外部声明线程变量,并在click listener上启动/停止同一线程吗?可能的重复?您不能在click listener外部声明线程变量,并在click listener上启动/停止同一线程吗?可能的重复在thx的副本中,我移动了final-Thread-Thread=new-Thread(new-MyServer());在onclick()外部,并在第二个onclick()中使用Thread.stop。这是我调用服务器类的主类,但现在我只得到了一个白色屏幕,没有任何按钮和任何东西。thx,我移动了final-Thread-Thread-Thread=new-Thread(new-MyServer());在onclick()外部,并在second onclick()中使用thread.stop。这是我的主类,我从中调用server类,但现在我得到的只是白色屏幕,没有任何按钮和任何东西。。