我应该怎么做才能停止执行线程?

时间:2014-01-16 17:35:53

标签: java android multithreading

import java.lang.Thread;
import java.util.Scanner;

class Running extends Thread{

    private boolean Run=true;

    public void shutdown(){
        Run=false;
    }
    public void run(){
        while(Run){
            for(int i=0;i<1000;i++){
                System.out.println("Starting Counter:"+i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

public class Volatile {
    public static void main(String[] args) {
        Running run1=new Running();
        run1.start();
        System.out.println("Press any key to stop thread execution");
        Scanner sc=new Scanner(System.in);
        sc.nextLine();
        run1.shutdown();
    }
}

我使用易失性关键字来停止线程执行。但无法得到解决方案

5 个答案:

答案 0 :(得分:4)

  

我应该怎么做才能停止线程执行?

因此,您的帖子提到了volatile关键字,但我在您发布的代码中没有看到它。您需要确保Runvolatile boolean,以便可以在主线程中更改它,而另一个线程将看到更改。

private volatile boolean Run=true;

但我认为问题是您只在外部Run循环中测试此while。也许你想在内部计数循环中也是如此。类似的东西:

for(int i = 0; i < 1000 && Run; i++) {

现在,一旦循环开始计数,它必须在之前完成,检查Run布尔值。这可能是未来1000秒。

答案 1 :(得分:1)

您正在使用正确的模式,但应用它有点错误:

仅在1000秒后检查Run标志,因为只有在完成for循环后才会检查它。将您的代码更改为以下内容:

public void run(){
    while(Run){
    for(int i=0;(i<1000) && (Run == true);i++){

        System.out.println("Starting Counter:"+i);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
    }
}

请注意,如果您不希望有效执行for循环,则必须完全删除while循环。

答案 2 :(得分:0)

前一段时间,只需调用Thread的{​​{1}}函数即可停止线程。如今,它已被弃用,因为它不安全,因此您必须从stop()内部停止Thread。你会找到一个很好的例子here。请记住,执行此操作不会立即停止该线程,它只是告诉它可以停止,Android会在发现必要时停止它。

答案 3 :(得分:0)

您的代码在for循环中保持1000秒,直到它最终再次到达while(run)分支。我猜这就是它无法正常工作的原因。

答案 4 :(得分:-1)

这是示例。您可以创建一个布尔字段并在run:

中进行检查
public class Sample implements Runnable {

   private volatile boolean isRunning = true;

   public void run() {

     while (isRunning) {
         //do work
     }
   }

   public void kill() {
       isRunning = false;
   }

}

要停止它,只需致电

sample.kill();

这应该有用。