首页>代码>java开发自定义线程池实例,基于maven构建>/threadpool-core/src/main/java/com/jp/nian/threadpool/core/PoolThread.java
package com.jp.nian.threadpool.core;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @ClassName: PoolThread  
 * @Description: 线程池中的线程 
 * 工作者线程与通常线程不同之处在于run()方法的不同。通常的线程,
    完成线程应该执行的代码后,自然退出,线程结束。
    虚拟机在线程结束后收回分配给线程的资源,线程对象被垃圾回收。]
    而这在池化的工作者线程中是应该避免的,否则线程池就失去了意义。
    作为可以被放入池中并重新利用的工作者线程,它的run()方法不应该结束,
    随意,在随后可以看到的实现中,run()方法执行完任务后,
    就将回收到池中,然后调用wait()方法,使自己等待而不是退出循环和run()。
    这就使线程池实现的要点。
 * @date: 2016年10月8日 下午2:23:07 
 * 
 * @author tanfan 
 * @version  
 * @since JDK 1.7
 */
public class PoolThread extends Thread {
	//线程的任务
	private Task task;
	//线程所在的线程池
	private ThreadPool pool;
	private ThreadLocal<Boolean> idleLocal = new ThreadLocal<Boolean>(){
		protected Boolean initialValue(){
			return true;
		}
	};
	
	//日志组件
	private static final Logger logger = LoggerFactory.getLogger(PoolThread.class);
	
	public PoolThread(ThreadPool pool) {
		this.pool = pool;
	}
	
	@Override
	public void run() {
		while(idleLocal!=null && idleLocal.get()){
			logger.debug("{} my task is |{}", this.getName(), task);
			if(task!=null){
				try{
					idleLocal.set(false);
					logger.debug("{} will be execute task", this.getName());
					task.doSomething();
					synchronized (this) {
						//归还这个Thread
						pool.returnToPool(this);
						if(pool.isShutdown()){
							logger.debug("find thread pool shutdown, I am going die......");
							break;
						}
						logger.debug("{} do the work and will be wait", this.getName());
						this.wait();
						logger.debug("{} is notifyed by other ", this.getName());
					}
					if(idleLocal!=null){
						idleLocal.set(true);
					}
				}catch(Exception e){
					logger.error("thread|{} execute task error",this.getName(), e);
				}
			}
		}
	}
	
	public Task getTask() {
		return task;
	}

	public void setTask(Task task) {
		logger.debug("{} set the task|{} now ...",this.getName(), task);
		this.task = task;
		synchronized (this) {
			logger.debug("{} set the task synchronized ...", this.getName());
			this.notifyAll();
		}
	}
	
	public ThreadLocal<Boolean> getIdleLocal() {
		return idleLocal;
	}

	public void setIdleLocal(ThreadLocal<Boolean> idleLocal) {
		this.idleLocal = idleLocal;
	}

	public void close() {
		synchronized (this) {
			this.notifyAll();
		}
	}
	
	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
	}
}
最近下载更多
heweimin  LV12 2022年7月18日
2469095052  LV8 2022年5月27日
mylzdy  LV12 2022年5月12日
2252536772  LV21 2020年7月22日
lironggang  LV38 2019年9月17日
lookerKing  LV1 2019年8月28日
huohaixiang  LV2 2019年8月19日
8317073  LV12 2019年7月16日
cj1234  LV6 2019年5月6日
191609616  LV5 2019年3月8日
最近浏览更多
爱情戴罪的羔羊  LV7 4月2日
sky1044  LV1 2月19日
heweimin  LV12 2022年7月18日
xuexizhuanyong23  LV16 2022年7月3日
2469095052  LV8 2022年5月27日
mylzdy  LV12 2022年5月12日
随便取个名字_哈哈  LV27 2021年11月7日
vae222  LV2 2021年5月3日
zhou4048  LV1 2021年4月15日
xb1406112453  LV5 2021年4月14日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友