请教:关于终止线程

ribut9225 2017-12-07 02:30:12
我程序界面上有一个进度条控件JSlider,在线程中控制进度条物循环显示
我的想法是按“启动”时,开始循环,按“停止”时,停止循环
现在的问题是,启动开始循环没有问题,但是按下停止时,进度条依然在前进,没有停止
请指点

按钮的代码

MyThread r2 = new MyThread(sd1);

if ( btnSd.getText().equals("启动")) {
r2.bStop = true;
r2.start();
btnSd.setText("停止");
}
else {
r2.bStop = false;
r2.interrupt();
btnSd.setText("启动");
}


线程是继承Thread

public class MyThread extends Thread {
private JSlider iSd; //进度条控件,JSlider
public boolean bStop; //是否要终止线程

//类的构造函数
public MyThread(JSlider sd) {
iSd = sd;
nType = 2;
}

//重写run方法
@Override
public void run() {
for(int i=0;i<10;i++) {
if( !bStop) {
break; //用户终止线程
}

iSd.setValue(0);
int nPos;
while(iSd.getValue()<iSd.getMaximum()){

System.out.println(bStop);
if ( !bStop) {
break; //用户终止线程
}
nPos = iSd.getValue();
nPos++;
iSd.setValue(nPos);
try {
this.sleep(10);
}
catch(InterruptedException e) {
System.out.println("err");
}
}
}
}
}

...全文
725 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljheee 2017-12-16
  • 打赏
  • 举报
回复
引用 18 楼 ribut9225 的回复:
[quote=引用 17 楼 ljheee 的回复:]  JSlider iSd;    //进度条控件,JSlider 这些UI控件放在子线程肯定不行。
控件如果不在线程里,进度条不会随着进度而改变显示位置,只会在循环结束后一下子显示到了最后 如果要实现显示进度条前时,不用子线程,那要用什么方法? [/quote] 提示:线程间通信。把数据项的变化,值传给主线程,让它去更新控件显示
ribut9225 2017-12-15
  • 打赏
  • 举报
回复
引用 17 楼 ljheee 的回复:
 JSlider iSd;    //进度条控件,JSlider 这些UI控件放在子线程肯定不行。
控件如果不在线程里,进度条不会随着进度而改变显示位置,只会在循环结束后一下子显示到了最后 如果要实现显示进度条前时,不用子线程,那要用什么方法?
ljheee 2017-12-09
  • 打赏
  • 举报
回复
 JSlider iSd;    //进度条控件,JSlider 这些UI控件放在子线程肯定不行。
ribut9225 2017-12-08
  • 打赏
  • 举报
回复
谢谢各位,的确是重复new了
ribut9225 2017-12-08
  • 打赏
  • 举报
回复
[/quote] 你确实重新new了,不信你每次把 r2 也直接 print 出来看一下[/quote] 那么,在按钮里的代码应该怎么写?
  • 打赏
  • 举报
回复
引用 13 楼 ribut9225 的回复:
[quote=引用 12 楼 dgqjava 的回复:] MyThread r2 = new MyThread(sd1);你每次都重新new了
没有重新new,按钮在“启动”时先new一个,然后再start,肯定没有重复new 我感觉bStop是不是在内存中另外复制了一份?[/quote] 你确实重新new了,不信你每次把 r2 也直接 print 出来看一下
ribut9225 2017-12-08
  • 打赏
  • 举报
回复
引用 12 楼 dgqjava 的回复:
MyThread r2 = new MyThread(sd1);你每次都重新new了
没有重新new,按钮在“启动”时先new一个,然后再start,肯定没有重复new 我感觉bStop是不是在内存中另外复制了一份?
dgqjava 2017-12-07
  • 打赏
  • 举报
回复
MyThread r2 = new MyThread(sd1);你每次都重新new了
ribut9225 2017-12-07
  • 打赏
  • 举报
回复
我又修改了代码,加了SetStop方法,而且观察到该函数已被调用,但是变量bStop为什么还是true?
请各位指点一下

ribut9225 2017-12-07
  • 打赏
  • 举报
回复
引用 7 楼 zzxzzxhao 的回复:
[quote=引用 6 楼 ribut9225 的回复:] 按钮代码中的

MyThread r2 = new MyThread(sd1);
                 
                if ( btnSd.getText().equals("启动")) {
                    r2.bStop = true;
                    r2.start();
                    btnSd.setText("停止");
                }
                else {
                    r2.bStop = false;
                    r2.interrupt();
                    btnSd.setText("启动");
                }
r2.bStop = false; 为什么不起作用?
get、set方法啊。。。[/quote] 不能直接使用类里的public volatile boolean bStop 吗?
ribut9225 2017-12-07
  • 打赏
  • 举报
回复
这是按钮里的代码

JButton btnSd = new JButton("\u542F\u52A8");
		btnSd.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				
				MyThread r2 = new MyThread(sd1);
				
				if ( btnSd.getText().equals("启动")) {
					r2.bStop = true;
					r2.start();
					btnSd.setText("停止");
				}
				else {
					r2.bStop = false;
					r2.interrupt();
					btnSd.setText("启动");
				}
				
			}
		});
这是线程类的代码,继承Thread,是一个新建的文件

package aa;

import javax.swing.JOptionPane;
import javax.swing.JSlider;
import javax.swing.JTextField;

/** 
* @author 作者 E-mail: 
* @version 创建时间:Dec 5, 2017 10:25:56 AM 
* 类说明 
*/

public class MyThread extends Thread {
	private JSlider iSd;	//进度条控件,JSlider
	public volatile boolean bStop;	//是否要终止线程
	
	//类的构造函数

	public MyThread(JSlider sd) {
		iSd = sd;
	}
	
	//重写run方法
	@Override
	public void run() {
		//线程的控件类型为JSlider(进度条)
		//不停的循环
		//bStop = true;	//默认是进行线程
		for(int i=0;i<3;i++) {
			if( !bStop) {
				break;	//用户终止线程
			}
			
			iSd.setValue(0);
			int nPos;
			while(iSd.getValue()<iSd.getMaximum()){
				
				System.out.println(bStop);
				
				if ( !bStop) {
					break;	//用户终止线程
				}
				nPos = iSd.getValue();
				nPos++;
				iSd.setValue(nPos);
				try {
					this.sleep(10);
				}
				catch(InterruptedException e) {
					System.out.println("err");
				}
			}
		}
	}
}
it狗_ 2017-12-07
  • 打赏
  • 举报
回复
能把完整的代码贴出来吗
  • 打赏
  • 举报
回复
引用 6 楼 ribut9225 的回复:
按钮代码中的

MyThread r2 = new MyThread(sd1);
                 
                if ( btnSd.getText().equals("启动")) {
                    r2.bStop = true;
                    r2.start();
                    btnSd.setText("停止");
                }
                else {
                    r2.bStop = false;
                    r2.interrupt();
                    btnSd.setText("启动");
                }
r2.bStop = false; 为什么不起作用?
get、set方法啊。。。
ribut9225 2017-12-07
  • 打赏
  • 举报
回复
按钮代码中的

MyThread r2 = new MyThread(sd1);
                 
                if ( btnSd.getText().equals("启动")) {
                    r2.bStop = true;
                    r2.start();
                    btnSd.setText("停止");
                }
                else {
                    r2.bStop = false;
                    r2.interrupt();
                    btnSd.setText("启动");
                }
r2.bStop = false; 为什么不起作用?
ribut9225 2017-12-07
  • 打赏
  • 举报
回复
我也很奇怪
按钮上的文字已变成"启动",但是进度条还是在前进,system.out.println输出显示为true


dgqjava 2017-12-07
  • 打赏
  • 举报
回复
现在输出还是一直true吗? 应该不会了吧
ribut9225 2017-12-07
  • 打赏
  • 举报
回复
改了,没起作用

public class MyThread extends Thread {
	private JSlider iSd;	//进度条控件,JSlider
	public volatile boolean bStop;	//是否要终止线程
	
	//类的构造函数

	public MyThread(JSlider sd) {
		iSd = sd;
	}
	
	//重写run方法
	@Override
	public void run() {
		//线程的控件类型为JSlider(进度条)
		//不停的循环
		//bStop = true;	//默认是进行线程
		for(int i=0;i<10;i++) {
			if( !bStop) {
				break;	//用户终止线程
			}
			
			iSd.setValue(0);
			int nPos;
			while(iSd.getValue()<iSd.getMaximum()){
				
				System.out.println(bStop);
				if ( !bStop) {
					break;	//用户终止线程
				}
				nPos = iSd.getValue();
				nPos++;
				iSd.setValue(nPos);
				try {
					this.sleep(10);
				}
				catch(InterruptedException e) {
					System.out.println("err");
				}
			}
		}
	}
}
dgqjava 2017-12-07
  • 打赏
  • 举报
回复
这个public boolean bStop 改成public volatile boolean bStop
ribut9225 2017-12-07
  • 打赏
  • 举报
回复
我用system.out.println(bStop)来观察变量的值 即使我按下“停止”,bStop输出一直是true 这是怎么会事?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧