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. 文章13称号 Add Two Numbers

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...

  2. [DEEP LEARNING An MIT Press book in preparation]Deep Learning for AI

    动人的DL我们有六个月的时间,积累了一定的经验,实验,也DL有了一些自己的想法和理解.曾经想扩大和加深DL相关方面的一些知识. 然后看到了一个MIT按有关的对出版物DL图书http://www.iro ...

  3. 《Javascript权威指南》13号学习笔记:使用日期和时间

    一.创Date示例 1.Date类的方法和属性是非常不静,故,申请书Date属性和方法之前.必须创建Date类的实例. var date = new Date();  //以当前日期和时间创建实例. ...

  4. leetcode文章137称号-Single Number II

    #include<stdio.h> #include<stdlib.h> int singleNumber(int* nums, int numsSize) { int cou ...

  5. 正则、grep、sed、awk

    每次用到正则都要蛋疼一下,索性总结一下在这里. 正则 正則表達式主要分为基础正则和扩展正则.注意,正则和一般命令行输入的命令的通配符不同.正则仅仅使用于支持这样的表示法的工具,如:vi,grep,se ...

  6. hdu 5045 费用流

    滚动建图,最大费用流(每次仅仅有就10个点的二分图).复杂度,m/n*(n^2)(n<=10),今年网络赛唯一网络流题,被队友状压DP秒了....难道网络流要逐渐退出历史舞台???.... #i ...

  7. SICP 习题(1.1,1.2,1.3,1.4)解题总结。

    近来在重读SICP,以前读过一次,读了第一二章就没有坚持下去,时间一长就基本忘记了,脑海里什么都不剩,就隐约记得自己曾经读过一本很牛B的书. 这次读希望能够扎实一点,不管能读到哪里,希望可以理解一些东 ...

  8. POJ 3982 序列 塔尔苏斯问题解决

    而且还加入了大量的主题,直接或模板Java我们能够在水. 除了循环33它的时间,计算A99它是第几,输出准确回答. #include <stdio.h> #include <stri ...

  9. JAVA该队列中的数组,圆阵队列,链队列

    /** * 文件名:QueueText.java * 时间:2014年10月22下午9:05:13 * 笔者:维亚康姆维修 */ package chapter3; /** * 类名:ArrayQue ...

  10. SSH深度历险(三) EJB Session Bean有状态和无状态的差别与联系

    刚開始对两种sessionbean存在误解.觉得有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用.而觉得无状态是每次调用实例化一次,不保留用户信息.细致分析并用实践检验后,会发现,事实 ...