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并发实现三(线程的挂起和恢复)的更多相关文章

  1. Java并发编程:线程控制

    在上一篇文章中(Java并发编程:线程的基本状态)我们介绍了线程状态的 5 种基本状态以及线程的声明周期.这篇文章将深入讲解Java如何对线程进行状态控制,比如:如何将一个线程从一个状态转到另一个状态 ...

  2. Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  3. Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  4. Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  5. Java并发编程:线程池的使用(转)

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  6. Java并发编程:线程池的使用(转载)

    转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  7. Java并发编程:线程池的使用(转载)

    文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  8. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  9. 【转】Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  10. 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

随机推荐

  1. 修改文件所有者 chown

    将upload目录权限改为777,sudo chmod 777 upload,再测试上传功能成功.但这种修改权限的方法并不安全.故可以改upload目录的拥有者为www-data(即apache)   ...

  2. 苹果推送APNS总结 (

    开发状态服务器地址 gateway.sandbox.push.apple.com 2195产品状态服务器地址 gateway.push.apple.com         2195 Developme ...

  3. @IBDesignable和@IBInspectable

    近期一直在看苹果公司提供的两本swift官方教程电子书,一部是<The Swift Programming Language>,还有一部是<Using Swift With Coco ...

  4. Java学习笔记——JDBC读取properties属性文件

    Java 中的 properties 文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件. 文件的内容是格式是"键=值"(key-valu ...

  5. samba服务简介

    1.1 Samba 概述Samba主要用于Windows和Linux之间的文件共享,也一样用于Linux和Linux之间的共享文件:不过对于Linux和Linux之间共享文件有更好的网络文件系统NFS ...

  6. HQL查询

    HQL ,Hibernate Query Language ,是Hibernate查询语言,不直接操作数据表,而是操作实体类,根据实体类和对应数据表中的映射关系,查找数据. 下面是hql的基本步骤: ...

  7. csv 导入到 access中去

    Csv中有500万数据,导入到Access中去,每6万条数据为1Table 先是参照着http://support.microsoft.com/kb/257819/zh-cn来写 1.找不到可安装的  ...

  8. Grand Central Dispatch(GCD)详解(转)

    概述 GCD是苹果异步执行任务技术,将应用程序中的线程管理的代码在系统级中实现.开发者只需要定义想要执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务.由于 ...

  9. C#摇奖程序

    private void Form1_Load(object sender, EventArgs e) { //取消跨线层访问控件的判断 Control.CheckForIllegalCrossThr ...

  10. C#string与char互转

    string s = "asdf"; //字符转char char[] c = s.ToCharArray(); Console.WriteLine(s[]); //char转st ...