博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA并发实现三(线程的挂起和恢复)
阅读量:4986 次
发布时间:2019-06-12

本文共 2245 字,大约阅读时间需要 7 分钟。

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

转载于:https://www.cnblogs.com/xiaotao726/p/5475785.html

你可能感兴趣的文章
目录_JVM专题
查看>>
C++求任意数组长度
查看>>
返回一个二维整数数组中最大联通子数组的和
查看>>
log4j 将web请求 日志输入到数据库
查看>>
125-初识布尔运算(比较运算)
查看>>
前端学习笔记之CSS后代选择器、子元素选择器、相邻兄弟选择器区别与详解
查看>>
ionic所支持的所有事件events
查看>>
Java学习之——泛型
查看>>
HTTP POST GET 本质区别详解
查看>>
css+div
查看>>
使用Java API的5个技巧
查看>>
Java生鲜电商平台-系统架构与技术选型
查看>>
nginx+keepalived简单双机主从热备
查看>>
vue mint-ui 三级地址联动
查看>>
前端异常和性能监控(转)
查看>>
多线程程序的测试和调试
查看>>
Python练习_购物车_day6
查看>>
Codeforces Round #446 (Div. 2)
查看>>
android学习笔记41——图形图像处理1
查看>>
realloc函数实现数组动态增长
查看>>