多线程工作处理

张军 5970 0

多线程工作处理接口

package zj.thread.bean;

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



更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论