停止线程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类,但现在我得到的只是白色屏幕,没有任何按钮和任何东西。。