一个好用的工作线程
来源:互联网 发布:淘宝的牛肉为什么便宜 编辑:程序博客网 时间:2024/05/21 10:17
import java.util.logging.Logger;
public abstract class WorkThread extends Thread {
private boolean pause;
private boolean shutdown;
private Logger log = null;
public WorkThread() {
super();
this.addShutdownHooker(new Thread() {
public void run() {
log.warning("System is shutdown,begin to do final process");
doFinal();
}
});
}
public WorkThread(String workerName) {
super(workerName);
this.addShutdownHooker(new Thread() {
public void run() {
log.warning("System is shutdown,begin to do final process");
doFinal();
}
});
}
public boolean isPause() {
return pause;
}
public void run() {
beforeWork();
while (!this.isShutdown()) {
try {
if (!pause) {
work();
} else {
log.fine("WorkThread " + getName() + " is pause");
}
} catch (Throwable e) {
log
.severe("WrokThread "
+ getName()
+ " throw uncaughtException/n[----------------Throwable----------------]/n"
+ e
+ "/n[-----------------Cause-------------------]/n"
+ e.getCause());
e.printStackTrace();
this.shutdown();
}
}
log.warning("WorkThread " + getName() + " is shutdown");
afterWork();
}
/**
*
*线程启动前调用此方法,主要是初始化一些运行参数
*/
protected void beforeWork() {
}
/**
*
*线程即将退出时调用此方法,可以做一些清理工作
*/
protected void afterWork() {
}
/**
* 客户端必须实现的方法,此方法会被循环调用直到用户关闭线程或暂停线程
* @throws InterruptedException
*/
public abstract void work() throws InterruptedException;
/**
*
*以守护线程的方式启动线程
*/
public void startDaemon() {
log = Logger.getLogger(getName());
this.setDaemon(true);
this.start();
}
/**
* 当线程处于暂停状态时可以调用此方法使线程继续工作
*
*/
public synchronized void restart() {
this.pause = false;
}
/**
* 暂停工作
*
*/
public synchronized void pause() {
this.pause = true;
}
/**
* 主动关闭线程
*
*/
public synchronized void shutdown() {
pause();
this.shutdown = true;
}
/**
* 判断此线程是否已经关闭
* @return
*/
public boolean isShutdown() {
return shutdown;
}
/**
* 当系统退出时此方法将被虚拟机运行
*
*/
protected void doFinal() {
}
/**
*
* 添加一个系统钩子
* @param thread
*/
protected void addShutdownHooker(Thread thread) {
Runtime.getRuntime().addShutdownHook(thread);
}
public String toString() {
return "WorkThread " + getName() + " [Pause = " + this.isPause()
+ " | Shutdown = " + this.isShutdown() + " | Interrupt = "
+ this.isInterrupted() + " | Alive = " + this.isAlive()
+ " | Daemon = " + this.isDaemon() + "]";
}
}
- 一个好用的工作线程
- 一个好用的线程池
- 工作问题-java-一个好用的正则表达式
- 一个绝好的工作方式
- 一个封装好的线程类
- 一个封装好的线程类
- 一个线程好的书写例程
- 关键字想要有一个好的排名细节工作很重要
- 让父线程负责子线程回收工作的好方法
- 一个简单好用的不加锁队列,用于单线程单次读取队列元素
- 关于进程和线程比较好的一个解释
- 工作中经常用的好工具
- 好的工作习惯
- 一份好的工作
- 好的工作习惯
- 通过一个有趣的例子说明线程的工作机制
- android是用一个服务好还是开一个线程好
- 一个好用的电子地图
- 介绍一些在网络编程中常用的工具方法
- 给WINDOWS服务加上描述
- Peercast电台收听XML记录
- oracle存储参数(storage子句)含义及设置技巧
- WINDOWS快捷键
- 一个好用的工作线程
- 笑傲江湖曲谱
- 妆台秋思
- 糯米糊糊4
- 灰姑娘
- 今天课讲的不错
- TreeView和数据库
- 我的地盘
- ASP.NET Membership