您的位置:首页 > 编程语言 > Java开发

java多线程之入门(2)

2015-01-03 19:43 127 查看
转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/42366759
作者:小马

接着上一篇,用多线程重新实现counter1的示例,这样不会产生假死现象,如下图:



达到这样效果的原理就是start按钮开启的计数显示行为放在一个子线程里运行,这样主线程窗体的事件响应就不会受到阻塞。

public class Counter2 extends JApplet
{
	private class SeparateSubTask extends Thread
	{
		private int count = 0;
		private boolean runFlag = true;
		public SeparateSubTask() 
		{
			// TODO Auto-generated constructor stub
			start();
		}
		void invertFlag()
		{
			runFlag = !runFlag;
		}
		public void run()
		{
			while(true)
			{
				try 
				{
					sleep(100);
				} 
				catch (InterruptedException e) 
				{
					// TODO: handle exception
					System.err.println("interrupted");
				}
				if(runFlag)
				{
					t.setText(Integer.toString(count++));
				}
			}
		}
	}


子线程类用到了内部类,结构更紧凑,而且也便于子线程类访问像JTextField这样的私有成员,run函数的实现放在了这个线程类中。另外,SeparateSubTask作为私有的内部类,表示只有Counter2有权限访问它,其它类都禁止。

run函数里,sleep有必要多说几句,不要以为没有这个sleep程序就会假死。其实子线程已经在运行了,程序可以正常的响应主线程中的任何事件,这个sleep唯一影响的就是显示数字的速度。

class StartL implements ActionListener
	{
		//点击start按钮触发go函数执行。
		public void actionPerformed(ActionEvent e)
		{
			if(sp == null) sp = new SeparateSubTask();
		}
	}
	
	class OnOffL implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			if(sp != null) sp.invertFlag();
		}
	}


start按钮的事件监听对象的实现也变了,由原来的直接调用go函数改为启动一个子线程,而toggle按钮的事件监听实现还是一样的,改变runFlag标志的状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: