多線程工作處理接口
package zj.thread.bean; /** * 多線程工作處理接口 * * @version 1.00 (2014.09.15) * @author SHNKCS 張軍 {@link <a target=_blank href="http://m.eyofj.com">張軍個(gè)人網(wǎng)站</a> <a target=_blank href="http://user.qzone.qq.com/360901061/">張軍QQ空間</a>} */ public interface IWorkerService<T> { /** * 處理業(yè)務(wù) * * @param worker * 工作對(duì)象 * @author 張軍 * @date 2015-11-03 21:59:00 * @modifiyNote * @version 1.0 */ public void doWork(); /** * 處理業(yè)務(wù)拋出的異常信息 * * @param t * 線程對(duì)象 * @param e * 異常信息 * @author 張軍 * @date 2015-11-03 21:59:00 * @modifiyNote * @version 1.0 * @return 是否退出程序[true:退出,false:繼續(xù)] */ public boolean exceptionQuit(Thread t, Throwable e); /** * 設(shè)置workerThread對(duì)象 * * @param worker * 工作對(duì)象 * @author 張軍 * @date 2015-11-03 21:59:00 * @modifiyNote * @version 1.0 */ public void setWorker(WorkerThread<T> worker); /** * 獲取workerThread對(duì)象 * * @param worker * 工作對(duì)象 * @author 張軍 * @date 2015-11-03 21:59:00 * @modifiyNote * @version 1.0 */ public WorkerThread<T> getWorker(); }
多線程工作處理實(shí)現(xiàn)類(lèi)
package zj.thread.bean; import org.apache.log4j.Logger; /** * 多線程工作處理實(shí)現(xiàn)類(lèi) * * @version 1.00 (2014.09.15) * @author SHNKCS 張軍 {@link <a target=_blank href="http://m.eyofj.com">張軍個(gè)人網(wǎng)站</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) { // 此方法必須要實(shí)現(xiàn) this.worker = worker; } @Override public WorkerThread<T> getWorker() { return worker; } @Override public boolean exceptionQuit(Thread t, Throwable e) { logger.error("線程[" + t.getName() + "]執(zhí)行發(fā)生異常,默認(rèn)退出", 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://m.eyofj.com">張軍個(gè)人網(wǎng)站</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; // 多線程處理對(duì)象計(jì)數(shù)器 private CountDownLatch latch; // 業(yè)務(wù)處理對(duì)象 private IWorkerService<T> service; // 業(yè)務(wù)參數(shù) private T task; /** * 構(gòu)造對(duì)象 * * @param latch * 多線程處理對(duì)象計(jì)數(shù)器 * @param service * 業(yè)務(wù)處理對(duì)象 * @param task * 業(yè)務(wù)參數(shù) */ public WorkerThread(IWorkerService<T> service, T task) { this(null, service, task); } /** * 構(gòu)造對(duì)象 * * @param latch * 多線程處理對(duì)象計(jì)數(shù)器 * @param service * 業(yè)務(wù)處理對(duì)象 * @param task * 業(yè)務(wù)參數(shù) */ public WorkerThread(CountDownLatch latch, IWorkerService<T> service, T task) { this.latch = latch; this.service = service; this.task = task; this.service.setWorker(this); catchException(); } /** * 啟動(dòng)工作 */ public void run() { service.doWork();// 工作了 // 不放在finally中為了鎖定線程,由手動(dòng)退出線程 finish(); } /** * 當(dāng)線程出錯(cuò)時(shí),手動(dòng)完成工作 */ public void finish() { if (latch != null) { latch.countDown();// 完成工作,計(jì)數(shù)器減一 } } /** * 捕獲異常信息 */ private void catchException() { this.setUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { boolean finish = service.exceptionQuit(t, e); if (finish) { finish(); } } }); } }
本文為張軍原創(chuàng)文章,轉(zhuǎn)載無(wú)需和我聯(lián)系,但請(qǐng)注明來(lái)自張軍的軍軍小站,個(gè)人博客http://m.eyofj.com
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
