timed【超时模式】案例:一个线程提供下载数据,另一个线程执行下载,如果有5秒钟以上,提供下载的线程没有提供数据,下载线程因超时异常,停止下载线程运行。

超时异常类

/**
*
*/
package com.benxq.thread6; import java.util.concurrent.ExecutorService; /**
* 超时异常类
* Created by qucf on 2015年10月22日.
*/
public class TimeOutException extends InterruptedException{ public TimeOutException(String msg) {
super(msg);
}
}

下载数据类

/**
*
*/
package com.benxq.thread6; /**
* 下载数据类
* Created by qucf on 2015年10月23日.
*/
public class FileData {
//提供下载的数据
private String data;
//有数据下载标示
private boolean flag;
//超时时间
private long timeout; public FileData(String data,boolean flag,long timeout){
super();
this.data=data;
this.flag=flag;
this.timeout=timeout;
} //修改状态,唤醒其他线程
public synchronized void changeStuatus(String data){
this.data=data;
this.flag=true;
notify();
} //下载操作,如果等待1000秒没有数据下载就报超时异常
public synchronized void execu() throws InterruptedException {
//开始执行的时间
long start=System.currentTimeMillis();
int i=0;
System.out.println("FileData.execu()下载开始");
//如果没有数据
while(!flag){
//现在的时间
long now=System.currentTimeMillis();
long reset=timeout-(now-start);
if(reset<=0){
throw new TimeOutException("已经等候"+timeout+"时间了,还没有数据下载");
}
wait(reset);
}
//下载操作
download();
}
//真正下载操作
private void download(){
System.out.println("顺利下载数据===>:"+data);
this.flag=false;
} public String getData() {
return data;
} public void setData(String data) {
this.data = data;
} public boolean isFlag() {
return flag;
} public void setFlag(boolean flag) {
this.flag = flag;
} public long getTimeout() {
return timeout;
} public void setTimeout(long timeout) {
this.timeout = timeout;
}
}

提供数据线程

/**
*
*/
package com.benxq.thread6; /**
* 提供数据的线程类
* Created by qucf on 2015年10月23日.
*/
public class GiveDataThread implements Runnable{ //公共数据
private FileData fileData; public GiveDataThread(FileData fileData) {
super();
this.fileData=fileData;
} @Override
public void run() { //制造数据线程,
for (int i = 0; i < 10; i++) {
fileData.changeStuatus("制造数据"+i);
System.out.println("[提供数据线程池提供数据]=》制造数据"+i); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } }

下载数据线程

/**
*
*/
package com.benxq.thread6; /**
* Created by qucf on 2015年10月23日.
*/
public class DownThread implements Runnable{
private FileData fileData;
private boolean flag=true;
public DownThread(FileData fileData){
this.fileData=fileData;
} @Override
public void run() {
System.out.println("开始下载。。。。。");
while(flag){
try {
fileData.execu();
} catch ( TimeOutException e) {
e.printStackTrace();
flag=false;
}catch (InterruptedException e) {
System.out.println("下载超时");
}
}
System.out.println("下载线程超时执行完毕");
} }

主线程

/**
*
*/
package com.benxq.thread6; /**
* Created by qucf on 2015年10月23日.
*/
public class Test { public static void main(String[] args) { FileData file=new FileData("hah", true, 5000);
Thread give=new Thread(new GiveDataThread(file));
Thread down =new Thread(new DownThread(file)); give.start();
down.start();
}
}

多线程学习之五超时模式Timer的更多相关文章

  1. 多线程学习之一独木桥模式Single Threaded Execution Pattern

    Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...

  2. javascript设计模式学习之五——策略模式

    一.策略模式定义: 定义一些列的算法/规则,将它们封装起来,使得它们可以互相替换/组合使用.其目的在于将算法/规则封装起来,将算法/规则的使用与实现分离出来. 通过策略模式,可以减少算法计算过程中大量 ...

  3. Java多线程学习(吐血超详细总结)

    本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的 ...

  4. Java多线程学习(转载)

    Java多线程学习(转载) 时间:2015-03-14 13:53:14      阅读:137413      评论:4      收藏:3      [点我收藏+] 转载 :http://blog ...

  5. [转]Java多线程学习(吐血超详细总结)

    转自:http://www.mamicode.com/info-detail-517008.html 本文主要讲了Java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法. ...

  6. Java多线程学习(吐血超详细总结)(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但 ...

  7. (转)Java多线程学习(吐血超详细总结)

    本文转自:http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能 ...

  8. Java多线程学习(吐血超具体总结)

    林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文仅仅能说是java多线程的一个入门.事实上Java里头线程全然能够写一本书 ...

  9. Java多线程学习(五)线程间通信知识点补充

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

随机推荐

  1. CSS——(2)与标准流盒模型

    部分博客<CSS--(1)基础>中简介了CSS的概念和几种用法,如今主要是介绍其的核心内容. 盒子模型 为了理解盒子模型,我们能够先从生活中的盒子入手.盒子是用来放置物品的,内部除了有物品 ...

  2. php方法综述除去换行符(PHP_EOL使用变量)

    一个小包裹,事实上,不同的平台具有不同的实现.为什么要这样.它可以是一个世界是多样的. 最初unix与世界把它包/n取代,但windows为了体现自己的不同.要使用/r/n,更有意思的是,mac随着/ ...

  3. Javascript J更深层次的理解avascript 基础知识

    eval全局函数 dojo loader会看到如下的功能    var eval_ = new Function('return eval(arguments[0]);'); //Function 函 ...

  4. 如何设置eclipse在默认模式下打开文件

    如何设置eclipse在默认模式下打开文件 打开eclipse.选择例如以下:windows --> preferences --> General --> Editors --&g ...

  5. Android 获取屏幕大小和密度

    Android 获取屏幕大小和密度 DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay ...

  6. SQL入门学习4-复杂查询

    5-1 视图 视图和表 视图和表的区别只有一个是否保存了实际的数据 使用INSERT和SELECT实际上就是从存储设备中读取数据,各种计算后,将数据呈现给用户. 视图不会将数据保存在存储设备中.实际上 ...

  7. Akka 简介与入门

    Akka 简介与入门 http://www.thinksaas.cn/group/topic/344095/ 参考官网  http://akka.io/ 开源代码  https://github.co ...

  8. Async和Await进行异步编程

    使用Async和Await进行异步编程(C#版 适用于VS2015) 你可以使用异步编程来避免你的应用程序的性能瓶颈并且加强总体的响应.然而,用传统的技术来写异步应用是复杂的,同时编写,调试和维护都很 ...

  9. Web 服务器 (IIS) 角色

    原文:Web 服务器 (IIS) 角色 1. 对于默认安装,请在命令行提示符下键入以下命令,然后按 Enter: start /w pkgmgr /iu:IIS-WebServerRole;WAS-W ...

  10. kd-tree注解 &amp; bzoj 2648 &amp; 2716 &amp; 3053 解决问题的方法

    [KD-TREE简介]于SYC1999大神"迷住"下一个.我开始接触这样的算法. 首先.这个概念大概能去百度百科.详细的实施.我在看RZZ的代码长大的. 我们能够想象在平面上有N个 ...