2013-04-25 109 views
1

我该如何正确停止或中断我的多个服务器的线程? 这是我的主程序部分,在这里我开始我的多个服务器,但我想实现停止按钮,导致我的程序总是卡住,当我中断它。我可以在这里主要部分吗?我应该使用哪个函数?停止线程onclicklistener java

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 


      } 
     }); 
+0

难道你不能只在声音监听器外面声明线程变量,并且在点击监听器上启动/停止相同的线程吗? – AndroidHustle 2013-04-25 17:51:14

+0

可能重复的[你如何杀死Java中的线程?](http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java) – Raedwald 2016-09-04 08:26:22

回答

1

首先,你必须声明外onClick你的线程变量,以便能够从第二听者访问:

final Thread thread=new Thread (new MyServer());

final修改注意:您正在使用这个变量在只能访问外部方法的最终变量的匿名内部类中。

现在你的第一个onClick()将刚刚开始线程。

 public void onClick(View v) { 
      tvOut.setText("Server Started"); 
      thread.start(); 
     } 

现在,如何停止线程?您可以拨打thread.stop()。但其方法由于各种原因而被弃用,超出了本讨论范围。你可以在互联网上找到原因。

那么,如何停止线程?这取决于它在做什么。您可以检查isInterrupted()进入线程,在这种情况下,请从您的第二个监听程序调用thread.interrupt()。其他方法是使用布尔标志和wait() - notify()对。

有很多关于线程的教程。阅读其中的一些。如果事情还不清楚,请再次来这里问一些更具体的问题。祝你好运,享受。

+0

thx,我感动了最后Thread thread = new Thread(new MyServer());在onclikc()之外,并在第二个onclick()中使用thread.stop。这是我从中调用服务器类的主要类,但现在我只有白色屏幕,没有任何按钮和任何东西。 – chajka 2013-04-25 19:23:42

0

如果你想从不同的块访问的主题,你应该有它的声明为字段或最后的变量访问到所有的方法或类,而不是在内部匿名类,像这样

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... 
     } 
    } 
} 

,并在你的代码,你会做什么:

public void yourMethod(){ MyServer server = new MyServer();

button.setOnClickListener(new View.OnClickListener() { 
    //OnClickListener oclbutton=new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      tvOut.setText("Server Started"); 
      Thread yourThread=new Thread (server); 
      thread.start(); 
     } 
    }); 

    buttonStop.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //stop server 
      server.setStopExecution(true); 
     } 
    }); 
} 

最后一种方法是避免显示器出现问题的正确方法。另外看看Executor类来管理你的线程。

0

一个好的方法来停止一个线程是用一个标志从run()方法正确退出:See this answer

如果myServer上正在等待Thread.sleep()方法可以调用myServer.interrupt()来取消睡眠。
如果myServer在I/O上被阻塞,它会稍微复杂一点:Look at this