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. C/C++综合測试题(三)

    又刷了一套题 这些题都是百度.阿里巴巴.腾讯.网易.新浪等公司的面试原题,有一定的难度.只是确实相当有水平,能够通过做题来查漏补缺. 1.补充以下函数代码: 假设两段内存重叠,用memcpy函数可能会 ...

  2. UVA 239 - Tempus et mobilius. Time and motion(更换周期)

    UVA 239 - Tempus et mobilius. Time and motion 题目链接 题意:这题题意也是吊得飞起,看了老半天,大概是这样: 有一个放球的队列.和3个轨道(说白了就是栈) ...

  3. STL 清除模板容器 clear.h

    #pragma once #include "GeometricMacro.h" #include "GeometricEnum.h" #include &qu ...

  4. Html 5 坦克大战(韩顺平县版本号)

    html 5例如,下面的代码段: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/ ...

  5. C++ Primer 学习笔记_41_STL实践与分析(15)--先来看看算法【下一个】

    STL实践与分析 --初窥算法[下] 一.写容器元素的算法 一些算法写入元素值.在使用这些算法写元素时一定要当心.必须.写入输入序列的元素 写入到输入序列的算法本质上是安全的--仅仅会写入与指定输入范 ...

  6. ural 1932 The Secret of Identifier (容斥原理)

    标题效果: 计算到n字符串. 精确到只是有一个不同的字符,两个不同的字符.三个不同的字符,四对不同的字符. IDEAS: 枚举状态. dp[i] [j] ...当前串取出 i 状态下的全部字符转化成十 ...

  7. [SignalR]Self-Host

    原文:[SignalR]Self-Host SignalR 的Self-Host,可以将客户端脚本需要调用的服务端后台代码寄宿在诸如控制台应用程序中,作为寄宿端需要.NET 4.5以及jquery.s ...

  8. 终结者:具体解释Nginx(一)

            相信非常多人都听过Nginx.这个小巧的东西能够和Apache及IIS相媲美. 那么它有什么作用呢?一句话.它是一个减轻Web应用server(如Tomcat)压力和实现Web应用se ...

  9. Linux下is not in the sudoers file(转)

    用sudo时提示"xxx is not in the sudoers file. This incident will be reported.其中XXX是你的用户名,也就是你的用户名没有权 ...

  10. Codeforces Round #254 (Div. 2):A. DZY Loves Chessboard

    A. DZY Loves Chessboard time limit per test 1 second memory limit per test 256 megabytes input stand ...