通过页面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来停止线程。
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来停止线程。
解决方案 »
- 谁有这个案例,给我看下哦,谢谢
- 从sun网站下载的RTPSocketPlayer.java为什么不能运行?
- 冇得结怎末回事?
- hibernate中怎么做select 1表.name,2表.age into 新表 from 1表,2表 ?
- 请问 JAVA 3D 有发展前途吗?我想问问大家 如果有人交流 加群13283529
- 关于MP3转换成MID文件的程序,实现方法,来者有分
- 请问常用的数据库开发工具是什么啊???
- IBM要求SUN对Java开源,究竟是什么意思呢?开些什么“源”呢?
- 请教关于weblogic8.1+JBX的配置问题,最好是完整文档,能用结贴
- 关于拷贝还是引用的概念题。
- java字符日期处理
- 一个关于窗口的问问题
MyThread myThread = new MyThread();
myThread.start();调用Thread的start方法开启线程jsf中有个stop按钮,调用它就会调用mythread.stopCurrentThread();
并捕获InterruptedException异常,
当执行stop函数时就会抛出这个异常
@Override
public synchronized void start() {
super.start();
this.flag = true;
}jsf,stop按钮调用当前线程mythread.stopCurrentThread();还是不能停止
能常建议:
要停止线程myThread时,调用myThread.interrupt(),而你在myThread的run()中测试线程是否被interrputed.
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();
}}我改了一下你的代码,你可以自己试试。
我试了一下,在run里用sleep也没有问题。
相对于异常处理,个人比较倾向于用flag支持,这个才是停止线程的 正确方法
据我分析肯定是楼主用到的按钮监听或者thread.setFlag(true);用的不对,导致在MyThread线程运行的时候,在main线程中的控制flag = false的语句先于thread.setFlag(true);结束了。
总是这个问题肯定是楼主线程执行的顺序出的岔子,楼主想要解决最好还是在thread.setFlag(true);和主线程中的控制flag的两条语句上下功夫。
这个问题的重点不是楼主你这段代码了,是楼主的监听和主线程中调用Mythread线程的代码,相信楼主贴出那段代码问题会很快解决的!
你这样只能算是变相达到了目的,其实你这个线程并没有真正的停止,只是它不再运行while里面的代码了,其实run方法还是会一直在跑的