JAVA并发实现三(线程的挂起和恢复)
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
JAVA并发实现三(线程的挂起和恢复)的更多相关文章
- Java并发编程:线程控制
在上一篇文章中(Java并发编程:线程的基本状态)我们介绍了线程状态的 5 种基本状态以及线程的声明周期.这篇文章将深入讲解Java如何对线程进行状态控制,比如:如何将一个线程从一个状态转到另一个状态 ...
- Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...
- Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- Java并发编程:线程池的使用(转)
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java并发编程:线程池的使用(转载)
转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...
- Java并发编程:线程池的使用(转载)
文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...
- [转]Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- 【转】Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
随机推荐
- [置顶] Android系统访问控制之Smack安全策略设计与实现
1. 制定smack规则 “Zygote”进程由init进程创建,它负责创建系统服务进程“systemserver”.“radio”进程和APP进程.其中“radio”进程的uid是1001,它能够实 ...
- Linux(CentOS 5.5) Redis安装
一,什么是redis redis是一个key-value存储系统. 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset ...
- [每日一题] 11gOCP 1z0-052 :2013-09-3 Because of frequent checkpoints...........................A30
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/11022433 正确答案:BC 这里我就偷一下懒了,引用 http://www.itpub. ...
- 2d-x中Lua类型强转问题
在Lua中,使用CCDictionary进行保存CCSprite对象,但是,在CCDictionary取出来的时候,此时是一个CCObject对象,无法调用子类精灵的一些方法.那只能进行强转的. 那么 ...
- web_api vs2015 新加标题无法打开
HomeController 去掉特性[Authorize]
- jQuery简介以及jQuery选择器
一 简介 1 定义:jQuery库是JavaScript的封装库 2 优点: 1) : 代码开源 2) : 选择器强大 3) : 完善的Ajax 4) : 浏览器兼容性高 5) : 文档完善(帮助文档 ...
- Redhat修改本地yum源
1.将Centos系统的ios文件传到服务器,比如传到/root目录下: 2.将ios文件挂载到本地,需要在本地建立一个文件夹,比如/yum; mkdir /yum mount -o loop /ro ...
- Codeforces Round #278 (Div. 1)
A A monster is attacking the Cyberland! Master Yang, a braver, is going to beat the monster. Yang an ...
- uva 759 - The Return of the Roman Empire
#include <cstdio> #include <string> #include <map> using namespace std; ; , , , , ...
- python之7-1类
面向对象的编程,其实是将对象抽象成类,然后在类中,通过init定义实例初始化函数和多个操作实例的函数. 整个类就如同一个模板,我们可以用这个模板生成众多具现实例,并赋予实例动作. py中定义类的大致格 ...