首页>代码>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日