多线程学习之五超时模式Timer
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的更多相关文章
- 多线程学习之一独木桥模式Single Threaded Execution Pattern
Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...
- javascript设计模式学习之五——策略模式
一.策略模式定义: 定义一些列的算法/规则,将它们封装起来,使得它们可以互相替换/组合使用.其目的在于将算法/规则封装起来,将算法/规则的使用与实现分离出来. 通过策略模式,可以减少算法计算过程中大量 ...
- Java多线程学习(吐血超详细总结)
本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的 ...
- Java多线程学习(转载)
Java多线程学习(转载) 时间:2015-03-14 13:53:14 阅读:137413 评论:4 收藏:3 [点我收藏+] 转载 :http://blog ...
- [转]Java多线程学习(吐血超详细总结)
转自:http://www.mamicode.com/info-detail-517008.html 本文主要讲了Java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法. ...
- Java多线程学习(吐血超详细总结)(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但 ...
- (转)Java多线程学习(吐血超详细总结)
本文转自:http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能 ...
- Java多线程学习(吐血超具体总结)
林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文仅仅能说是java多线程的一个入门.事实上Java里头线程全然能够写一本书 ...
- Java多线程学习(五)线程间通信知识点补充
系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...
随机推荐
- 深入研究Java类载入机制
深入研究Java类载入机制 类载入是Java程序运行的第一步,研究类的载入有助于了解JVM运行过程,并指导开发人员採取更有效的措施配合程序运行. 研究类载入机制的第二个目的是让程序能动态的控制类载 ...
- 左右sqlplus一些方法用于汇总
SQL> select * from v$version where rownum=1; BANNER --------------------------------------------- ...
- Java 启动线程的方式
面试题:JAVA启动线程的方式有哪些? 1.继承Thread [java] view plaincopy public class java_thread extends Thread{ public ...
- bonecp使用数据源
bonecp.properties jdbc.driverClass=oracle.jdbc.driver.OracleDriver jdbc.jdbcUrl=jdbc:oracle:thin:@19 ...
- ER模型
一.什么是ER模型 实体-联系图(Entity-RelationDiagram)用来建立数据模型,在数据库系统概论中属于概念设计阶段,形成一个独立于机器.独立于DBMS的ER图模型.通常将它简称为ER ...
- JavaEE入境后在做什么——公共入口疑问的答案
hi.大家好, 随着学生毕业的下一个学期,传智播客收集了许多优异的成绩或就业或普通医生分享工作经验,现在是时候让大家从发展的角度真正去聊天. 什么技术开发.我们传智播客的学员扮演什么样的角色,以及详细 ...
- 导航控制器生产,push,pop,root,index
AppDelegate.m #import "FirstViewController.h" @implementation AppDelegate - (BOOL)applicat ...
- boxfilter 实现
A implementation of boxfilter boxfilter 是均值滤波的一种改进.在以下这篇blog里面有介绍. http://www.cnblogs.com/easymind22 ...
- 【MongoDB】在windows平台mongodb切片集群(三)
在过去的两年我们博客详细阐述了零碎工作集群和打造过程.在这篇博客中,我们主要分析测试结果一起支离破碎集群. 首先来看看碎片集群的每个状态.你可以看出来复制集A和B都是正常的: 一.开启分片集合 开启一 ...
- Net 一个请求的处理流程
Net 一个请求的处理流程 1.浏览器请求 请求-准备环境-->处理请求 2.Aspnet 环境的创建 客户请求 IIS区分静态文件还是动态文件,静态文件直接文件返回,动态文件通过asp ...