多線程工作處理接口
package zj.thread.bean;
/**
* 多線程工作處理接口
*
* @version 1.00 (2014.09.15)
* @author SHNKCS 張軍 {@link <a target=_blank href="http://www.dlhighland.cn">張軍個人網站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">張軍QQ空間</a>}
*/
public interface IWorkerService<T> {
/**
* 處理業務
*
* @param worker
* 工作對象
* @author 張軍
* @date 2015-11-03 21:59:00
* @modifiyNote
* @version 1.0
*/
public void doWork();
/**
* 處理業務拋出的異常信息
*
* @param t
* 線程對象
* @param e
* 異常信息
* @author 張軍
* @date 2015-11-03 21:59:00
* @modifiyNote
* @version 1.0
* @return 是否退出程序[true:退出,false:繼續]
*/
public boolean exceptionQuit(Thread t, Throwable e);
/**
* 設置workerThread對象
*
* @param worker
* 工作對象
* @author 張軍
* @date 2015-11-03 21:59:00
* @modifiyNote
* @version 1.0
*/
public void setWorker(WorkerThread<T> worker);
/**
* 獲取workerThread對象
*
* @param worker
* 工作對象
* @author 張軍
* @date 2015-11-03 21:59:00
* @modifiyNote
* @version 1.0
*/
public WorkerThread<T> getWorker();
}多線程工作處理實現類
package zj.thread.bean;
import org.apache.log4j.Logger;
/**
* 多線程工作處理實現類
*
* @version 1.00 (2014.09.15)
* @author SHNKCS 張軍 {@link <a target=_blank href="http://www.dlhighland.cn">張軍個人網站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">張軍QQ空間</a>}
*/
public abstract class WorkerService<T> implements IWorkerService<T> {
private Logger logger = Logger.getLogger(this.getClass());
// 此屬性必須要定義
private WorkerThread<T> worker;
@Override
public abstract void doWork();
@Override
public void setWorker(WorkerThread<T> worker) {
// 此方法必須要實現
this.worker = worker;
}
@Override
public WorkerThread<T> getWorker() {
return worker;
}
@Override
public boolean exceptionQuit(Thread t, Throwable e) {
logger.error("線程[" + t.getName() + "]執行發生異常,默認退出", e);
return true;
}
}多線程工作處理
package zj.thread.bean;
import java.io.Serializable;
import java.util.concurrent.CountDownLatch;
import lombok.Getter;
import lombok.Setter;
/**
* 多線程工作處理
*
* @version 1.00 (2014.09.15)
* @author SHNKCS 張軍 {@link <a target=_blank href="http://www.shanghaijiadun.com">上海加盾信息科技有限公司</a> <a target=_blank href="http://www.dlhighland.cn">張軍個人網站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">張軍QQ空間</a>}
*/
@Getter
@Setter
public class WorkerThread<T> extends Thread implements Serializable {
private static final long serialVersionUID = 1L;
// 多線程處理對象計數器
private CountDownLatch latch;
// 業務處理對象
private IWorkerService<T> service;
// 業務參數
private T task;
/**
* 構造對象
*
* @param latch
* 多線程處理對象計數器
* @param service
* 業務處理對象
* @param task
* 業務參數
*/
public WorkerThread(IWorkerService<T> service, T task) {
this(null, service, task);
}
/**
* 構造對象
*
* @param latch
* 多線程處理對象計數器
* @param service
* 業務處理對象
* @param task
* 業務參數
*/
public WorkerThread(CountDownLatch latch, IWorkerService<T> service, T task) {
this.latch = latch;
this.service = service;
this.task = task;
this.service.setWorker(this);
catchException();
}
/**
* 啟動工作
*/
public void run() {
service.doWork();// 工作了
// 不放在finally中為了鎖定線程,由手動退出線程
finish();
}
/**
* 當線程出錯時,手動完成工作
*/
public void finish() {
if (latch != null) {
latch.countDown();// 完成工作,計數器減一
}
}
/**
* 捕獲異常信息
*/
private void catchException() {
this.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
boolean finish = service.exceptionQuit(t, e);
if (finish) {
finish();
}
}
});
}
}
本文為張軍原創文章,轉載無需和我聯系,但請注明來自張軍的軍軍小站,個人博客http://www.dlhighland.cn
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

