package com.subject01;
/**
* 通过标识位,实现线程的挂起和回复
* com.subject01.AlternateSuspendResume.java
* @author 孙涛
* 2016年5月9日
*/
public class AlternateSuspendResume implements Runnable {
private volatile int firstVal ;
private volatile int secondVal ;
// 线程挂起的标识
private volatile boolean suspendFlag ;
@Override
public void run() {
// TODO Auto-generated method stub
try {
suspendFlag = false ;
firstVal = 0 ;
secondVal = 0 ;
workMethod();
} catch (Exception e) {
// TODO: handle exception
}
}
private boolean areValueEqual(){
return firstVal == secondVal ;
}
private void workMethod() throws InterruptedException{
int val = 1 ;
while(true){
// 仅当线程挂起的时候,才运行这段代码
waitWhileSuspended();
stepOne(val);
stepTwo(val);
val++ ;
// 仅当线程挂起的时候才运行这段代码
waitWhileSuspended();
Thread.sleep(200);
}
}
private void stepTwo(int val) {
secondVal = val ;
}
private void stepOne(int val) throws InterruptedException {
firstVal = val ;
Thread.sleep(300);
}
private void waitWhileSuspended() throws InterruptedException {
//这是一个“繁忙等待”技术的示例。
//它是非等待条件改变的最佳途径,因为它会不断请求处理器周期地执行检查,
while(suspendFlag){
Thread.sleep(200);
}
}
private void supendRequest() {
this.suspendFlag = true ;
}
private void resumeRequest() {
this.suspendFlag = false ;
}
public static void main(String[] args) {
AlternateSuspendResume asr = new AlternateSuspendResume();
Thread t = new Thread(asr);
t.start();
try {
Thread.sleep(2000);
} catch (Exception e) {
}
for (int i = 0; i < 10; i++) {
asr.supendRequest();
//让线程有机会注意到挂起请求
//注意:这里休眠时间一定要大于
//stepOne操作对firstVal赋值后的休眠时间,即300ms,
//目的是为了防止在执行asr.areValuesEqual()进行比较时,
//恰逢stepOne操作执行完,而stepTwo操作还没执行
try { Thread.sleep(350); }
catch ( InterruptedException x ) { }
System.out.println("dsr.areValuesEqual()=" +
asr.areValueEqual());
asr.resumeRequest();
try {
//线程随机休眠0~2秒
Thread.sleep(
( long ) (Math.random() * 2000.0) );
} catch ( InterruptedException x ) {
//略
}
}
System.exit(0); //退出应用程序
}
}
|--通过标识位合理的控制线程挂起的位置;
|--线程终止:线程在执行完run()方法之后,或者在run()中使用return,都可以将线程进行终止;同时也可以通过标识位灵活的控制线程终止的位置;
参考地址:http://blog.csdn.net/ns_code/article/details/17095733