通过页面jsf中的两个按钮来控制线程的执行,start按钮开启线程,stop按钮停止线程。可是开启线程后,在调用stop按钮停止线程,就是停止不了。
package com.digi.cda.bath.test;public class MyThread extends Thread {

private volatile boolean flag;

public void setFlag(boolean flag) {
this.flag = flag;
} @Override
public void run() {
while(flag) {
System.out.println("doJob");
}
}

public synchronized void stopCurrentThread() {
this.flag = false;
}}希望通过调用stopCurrentThread来停止线程。

解决方案 »

  1.   

    重写start方法  里面加个flag就好了
      

  2.   

    谢谢!能说的详细点吗?
    MyThread myThread = new MyThread();
    myThread.start();调用Thread的start方法开启线程jsf中有个stop按钮,调用它就会调用mythread.stopCurrentThread();
      

  3.   

    run函数里加一个sleep(0);
    并捕获InterruptedException异常,
    当执行stop函数时就会抛出这个异常
      

  4.   

     最好的方法就是加个flag来控制线程
      

  5.   

    重写start方法不可以:
    @Override
    public synchronized void start() {
    super.start();
    this.flag = true;
    }jsf,stop按钮调用当前线程mythread.stopCurrentThread();还是不能停止
      

  6.   

    没用Thread类提供的stop方法,那样做太粗暴了。我的想法是用一个flag来控制线程的执行,当flag=true的时候执行run方法,当flag=false的时候停止执行run方法。页面通过停止按钮来调用当前线程的stopCurrentThread()把flag设置成false就能停止了,这是我的想法。可是我运行的时候点击停止按钮线程还是在跑,一点用也没有
      

  7.   

    调了一下,好像继承Thread或者实现Runnable的类中间的flag变量不能从外部去改变它,只能在run方法内部进行判定,不然你试试在run方法里面加一个监听方法监听传入的引用按钮,然后通过这样在run内部重新设置flag的值。具体解决办法还得研究一下,你这样的用法没用过
      

  8.   

    你的想法总体上是正确的。对于你给出的这个代码,是能达到你的目的是。你说的不能停止,是由于:线程处于while循环内部在等待某种操作,这时还没有机会来测试那个flag.只有当下一轮循环开始时,才会测试flag,从而停止线程。
    能常建议:
    要停止线程myThread时,调用myThread.interrupt(),而你在myThread的run()中测试线程是否被interrputed.
      

  9.   

    public class MyThread extends Thread{ private volatile boolean flag; public void setFlag(boolean flag) {
    this.flag = flag;
    } @Override
    public void run() {
    long start = System.currentTimeMillis();
    while (flag) {
    if(System.currentTimeMillis() - start > 300){
    start = System.currentTimeMillis();
    System.out.println("doJob");
    }
    }
    } public synchronized void stopCurrentThread() {
    this.flag = false;
    }
    }
    public class Test { public static void main(String[] args) throws Exception{ MyThread thread = new MyThread();
    thread.setFlag(true);
    new Thread(thread).start();
    Thread.sleep(5000);
    thread.stopCurrentThread();
    }}我改了一下你的代码,你可以自己试试。
      

  10.   

    5秒以后线程终止,完全没有问题。
    我试了一下,在run里用sleep也没有问题。
      

  11.   

    相对于异常处理,个人比较倾向于用flag
      

  12.   


    相对于异常处理,个人比较倾向于用flag支持,这个才是停止线程的 正确方法
      

  13.   

    哇,楼主结贴率为 0.00% 耶!
    据我分析肯定是楼主用到的按钮监听或者thread.setFlag(true);用的不对,导致在MyThread线程运行的时候,在main线程中的控制flag = false的语句先于thread.setFlag(true);结束了。
    总是这个问题肯定是楼主线程执行的顺序出的岔子,楼主想要解决最好还是在thread.setFlag(true);和主线程中的控制flag的两条语句上下功夫。
    这个问题的重点不是楼主你这段代码了,是楼主的监听和主线程中调用Mythread线程的代码,相信楼主贴出那段代码问题会很快解决的!
      

  14.   


    你这样只能算是变相达到了目的,其实你这个线程并没有真正的停止,只是它不再运行while里面的代码了,其实run方法还是会一直在跑的