多線程工作處理接口
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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
