Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何停止线程_Java_Multithreading_Interrupt - Fatal编程技术网

Java 如何停止线程

Java 如何停止线程,java,multithreading,interrupt,Java,Multithreading,Interrupt,只是一个小问题,我想跳下面的线程,但我不知道我该怎么做。请帮帮我。谷歌的帮助这次没用了 new Thread(){ public void run() { while(!isInterrupted()){ try { if (sock1!=null){ sock1.setTcpNoDelay(true); if (btsar1.lengt

只是一个小问题,我想跳下面的线程,但我不知道我该怎么做。请帮帮我。谷歌的帮助这次没用了

new Thread(){
    public void run() {
        while(!isInterrupted()){
            try {
                if (sock1!=null){
                    sock1.setTcpNoDelay(true);
                    if (btsar1.length > 0) {
                        dos1 = new DataOutputStream(sock1.getOutputStream());
                        bwrtr1 = new BufferedWriter(new OutputStreamWriter(
                                dos1), 300);
                        dos1.write(btsar1);
                            set1free = false;
                    Log.e("Communication", "written(1.1)");
                        Reader1.reader(4);}
                    }} catch (IOException e) {
                    e.printStackTrace();
                }catch (NullPointerException e2){
                    e2.printStackTrace();
                }
            }
}}.start();
//.interrupt(); <-- or kinda that...
新线程(){
公开募捐{
而(!isInterrupted()){
试一试{
if(sock1!=null){
sock1.setTcpNoDelay(true);
如果(btsar1.length>0){
dos1=新的DataOutputStream(sock1.getOutputStream());
bwrtr1=新的缓冲写入程序(新的OutputStreamWriter(
dos1),300);
dos1.写入(btsar1);
set1free=false;
Log.e(“通信”,“书面(1.1)”);
读取器1.读取器(4);}
}}捕获(IOE异常){
e、 printStackTrace();
}捕获(NullPointerException e2){
e2.printStackTrace();
}
}
}}.start();

//.中断() 终止线程的最好方法是让它结束。所以,在<代码>中添加一个布尔标志,而<代码>,并让方法(或其他方法)公开它,以便将其设置为false。然后,您的线程将在交互完成后自然退出。

您只需要一个对线程的引用:

Thread t = new Thread(...);
然后你可以打断它:

t.interrupt();

一个想法:停止使用匿名线程

每当您发现自己的线程正在执行复杂的操作时,可以创建一个单独的类来扩展线程,该类可用于控制和监视行为,或者使用抽象的未来和线程池来完成这项工作

如果您继续使用这样的线程,您将有一个极其不可维护和不可恢复的代码

如何优雅地停止线程?

bool keepWorking = true;

while(keepWorking) {
  // keep working
}

synchronized void stopWork() {
  keepWorking = false;
}

// in other thread
threadObj.stopWork();
线程。中断
方法用于停止等待较长时间的线程(例如,等待输入)

请看这篇文章-

范例




“请帮帮我。”请正确拼写单词。这不是短信。对不起,是我的错。。。我有点赶时间^^一篇非常好的文章的可能重复:他的方法可能重复:
while(!interrupted)
比引入一个额外的不必要的布尔标志要好。特别是对于可中断的I/O方法。线程名称在另一个活动中给出,从该活动调用
Thread t = new Thread(){
      ... // content unchanged
};
t.start();
.....
t.interrupt();
public void stop() {
            Thread moribund = waiter;
            waiter = null;
            moribund.interrupt();
        }