java中线程销毁的问题,请解答!

fihming 2014-11-25 11:48:45
假设界面上有两个按钮A和B,A用来启动一个计算线程CalThread,经过既定时间(不确定),返回计算结果,返回结果的可能是另一个线程ResultThread。B用来停止或销毁计算线程,正常情况下,如果不点击按钮B,CalThread会正常进行,但结果返回前如果点击了B,则相当于未做任何点击A的操作,请教的主要问题是如何销毁线程,如何判断这个计算线程被销毁了,主要代码结构该怎么写?真心求教,求详细解答
...全文
474 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
nmyangym 2015-03-20
  • 打赏
  • 举报
回复
仅供楼主参考:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

/*
 * 线程类,运行时在文本区显示变化的数据。
 */
class ThreadClass1 implements Runnable {

	private JTextField textField; // 用于显示变化的数据文本区。
	private int loop = 0; // 辩护的数据计数。
	private boolean continueRun = true; // 控制线程的结束。

	// set get 方法
	public boolean isContinueRun() {
		return continueRun;
	}

	public void setContinueRun(boolean continueRun) {
		this.continueRun = continueRun;
	}

	// 构造函数
	public ThreadClass1(JTextField textField) {
		this.textField = textField;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (continueRun) {
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			textField.setText("The " + loop++ + "times out");// 每休眠10ms输出一次。
		}
	}
}

/*
 * 主类
 */
public class TestAlive1 extends JFrame {

	private static final long serialVersionUID = 1L;

	private Thread t1 = null; // 定义一个线程变量。
	private ThreadClass1 tc = null;

	// 定义2个按钮
	private JButton buttonStart;
	private JButton buttonStop;
	// 定义面板
	private JPanel jPanel;
	private JTextField textField;
	private JTextField textField1; // 显示状态

	public TestAlive1() {
		textField = new JTextField("result");
		textField1 = new JTextField("state");
		tc = new ThreadClass1(textField);

		buttonStart = new JButton("start");
		buttonStart.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				if (null == t1) {// 线程第一次启动
					t1 = new Thread(tc);
					tc.setContinueRun(true);
					t1.start();
					textField1.setText("t1 start the first time!");
					return;
				} else if (t1.isAlive()) {// 线程在启动中,按"start"键
					textField1.setText("t1 is started and is alive!!!");
					return;
				}// 线程结束后按"start"启动新的线程
				t1 = new Thread(tc);
				tc.setContinueRun(true);
				t1.start();
				textField1
						.setText(" A new thread t1 is started and is alive!!!");
			}
		});

		buttonStop = new JButton("stop");
		buttonStop.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				if (t1.isAlive()) {// 线程活动时按"stop"键结束线程
					tc.setContinueRun(false);
					textField1.setText("The thread t1 is stoped!!");
				} else {// 线程已经结束在按"stop"键。
					textField1
							.setText("the thread t1 is died please start a new thread!!");
					// System.out.println("the thread t1 is died");
				}
			}
		});

		jPanel = new JPanel(new FlowLayout());

		Container c = getContentPane();
		c.setLayout(new BorderLayout());

		jPanel.add(buttonStart);
		jPanel.add(buttonStop);
		c.add(jPanel, BorderLayout.NORTH);
		c.add(textField1, BorderLayout.CENTER);
		c.add(textField, BorderLayout.SOUTH);

		setSize(300, 200);
		setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}

	//入口
	public static void main(String[] args) {
		new TestAlive1();
	}
}
小白晒太阳 2015-03-20
  • 打赏
  • 举报
回复
引用 4 楼 Tro_picana 的回复:
基于1楼回复,假设这是A线程,开始在volatile boolean isRun = true; while(!isRun) return ; 结束线程,while语句写正常执行线程时计算的代码。设置isRun为false,线程A执行return语句结束自己。
cuole,还是该像1楼那样写,return写在外面才对。。
小白晒太阳 2015-03-20
  • 打赏
  • 举报
回复
基于1楼回复,假设这是A线程,开始在volatile boolean isRun = true; while(!isRun) return ; 结束线程,while语句写正常执行线程时计算的代码。设置isRun为false,线程A执行return语句结束自己。
fihming 2015-03-19
  • 打赏
  • 举报
回复
求回复!!!
lsweetyy 2014-11-26
  • 打赏
  • 举报
回复
楼上volatile正解,但是有一个复杂问题需要考虑,while循环内执行过长时间或者阻塞,此线程是不会执行到while退出,需要处理阻塞逻辑,如果确定为使用锁变量,可以在外面对这个线程执行不安全的stop或destroy方法。另外也可以写一个线程执行器服务,java.util.concurrent.ExecutorService,里面提供了shutdown和shutdownnow方法。
普凡 2014-11-26
  • 打赏
  • 举报
回复
提供一个开关变量,控制这个变量即可 volatile boolean isRun = false; public void run{ while(isRun){ ....等待另一个线程计算结果 } }

62,620

社区成员

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

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