首页 > 代码库 > java 加入一个线程、创建有响应的用户界面 。 示例代码

java 加入一个线程、创建有响应的用户界面 。 示例代码

javajava 加入一个线程、创建有响应的用户界面 。 示例代码

 来自thinking in java 4 21章  部分代码  目录21.2.11

thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155

package org.rui.thread.concurrent;

/**
 * 加入一个线程
 * 一个线程可以在其他线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。
 * 如果某个线程在另一个线程T上调用t.join() 此线程将被挂起,直到目标线程t结束才恢复(即 t.isAlive()返回为假)
 * @author lenovo
 *
 */
class Sleeper extends Thread
{
	 private int duration;
	 public Sleeper(String name,int sleepTime)
	 {
		 super(name);
		 duration=sleepTime;
		 start();
	 }
	 /**
	  * Sleeper 它要休眠一段时间 
	  */
	 @Override
	public void run() {
		try {
			sleep(duration);
		} catch (Exception e) {
			//根据 isInterrupted的返回值报告这个中断,当另一个线程在该线程上调用interrupt()时,
			//将给该线程设定一个标志,表明该线程已经中断,然而,异常被捕获时将清理这个标志,所以在catch子句中,
			//在异常被捕获的时候这个标志总是为假。除异常之外,这个标志还可有于其他情况,比如线程可能会检查其中断状态
			System.out.println(getName()+" was interrupted."+"isInterrupted() "+ isInterrupted());
			return;
		}
		System.out.println(getName()+"  has awakened");
	}
 
}

//////////////////////////////////
class Joiner extends Thread
{
	private Sleeper sleeper;
	public Joiner(String name,Sleeper sleeper)
	{
		super(name);
		this.sleeper=sleeper;
		start();
	}
	
	@Override
	public void run() {
		/**
		 * Joiner 线程将通过在sleeper对象上调用join方法来等待sleeper醒来.在main里面 
		 * 每个sleeper都有一个joiner,这可以在输出中发现,如果sleeper被 中断或者是正常结束,
		 * joiner将和sleeper一同结束
		 * 
		 */
		try {
			sleeper.join();
		} catch (InterruptedException e) {
			System.out.println("interrupted");
		}
		System.out.println(getName()+" join completed");
	}
	
}
//////////////////////////////////
public class Joining {
	public static void main(String[] args) {
		//线程1
		Sleeper sleepy=new Sleeper("Sleepy",1500),
				grumpy=new Sleeper("Grumpy",1500);
		
		//
		Joiner Dopey=new Joiner("Dopey",sleepy),
				doc=new Joiner("doc",grumpy);
		
		grumpy.interrupt();
	}
	}

/**
 * 注意,java SE5的java.util.concurrent类库包含诸如CyclicBarrier这样的工具。
 * 它们可能比最初的线程类库中的join更加合适
 * output:
 Grumpywas interrupted.isInterrupted() false
doc join completed
Sleepy  has awakened
Dopey join completed 
 */


package org.rui.thread.concurrent;
/**
 * 创建有响应的用户界面
 * 一个关注于运算,所以不能读取控制台输入,另一个把运算放在任务里单独运行,
 * 此时就可以在进行运算的同时监听控制台输入
 * @author lenovo
 *
 */

//无反应的
class UnresponsiveUI
{
	private volatile double d=1;
	public UnresponsiveUI()throws Exception
	{
		while(d>0)
			d=d+(Math.PI+Math.E);
			System.in.read();// 永远不会在这里
	}
		
}


public class ResponsiveUI extends Thread {
	private volatile static double d=1;
	
	
	public ResponsiveUI()
	{
		setDaemon(true);
		start();
	}
	@Override
	public void run() {
		//无限循环,显然程序 不可能到达读取控制台输入的那一行(编译器被欺骗了,相信while的条件使得程序能到达读取控制台输入的那一行)。
		//如果把建立UnresponsiveUI的那一行的注释解除掉再运行程序,那么要终止它的话,就只能杀死这个进程
		while(true)
			d=d+(Math.PI+Math.E)/d;
	}
	
	////////////////////
	public static void main(String[] args) throws Exception {
		//4new UnresponsiveUI();// 必须杀了这个线程
		new ResponsiveUI();
		System.in.read();
		System.out.println(d);//显示上传进度
		/**
		 * 要想让程序有响应,就得把计算程序放在run方法中,这样它就能让出处理器给别的程序。
		 * 当你按下‘回车’健的时候,可以看到计算确实在作为后台程序运行,同时还在等待用户输入。
		 */
	}
	

}
/**
 input:
 hello
 output: 根据停留时间输出:
68130.17629894095
 */