多线程工作处理接口
package zj.thread.bean; /** * 多线程工作处理接口 * * @version 1.00 (2014.09.15) * @author SHNKCS 张军 {@link <a target=_blank href="http://www.zhangjunbk.com">张军个人网站</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.zhangjunbk.com">张军个人网站</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.zhangjunbk.com">张军个人网站</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.zhangjunbk.com