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
*/