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();
}
}
我使用易失性关键字来停止线程执行。但无法得到解决方案
答案 0 :(得分:4)
我应该怎么做才能停止线程执行?
因此,您的帖子提到了volatile
关键字,但我在您发布的代码中没有看到它。您需要确保Run
是volatile 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();
这应该有用。