javajava 加入一个线程、创建有响应的用户界面 。 示例代码
来自thinking in java 4 21章 部分代码 目录21.2.11
thinking in java 4免费下载:http://download.youkuaiyun.com/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
*/