两类线程池:存放着固定数量的线程,如果一些线程死亡时,线程池立马自动补齐,下面(fix);另一类存放在一定数量的线程,如果线程死亡需要手动补给,下面的(file);
入口:
package org.show.server; import org.show.server.service.fix.FixThreadPoolService; import org.show.server.service.life.LifeThreadPoolService; public class StartUp { public static void main(String[] args) { // /// life LifeThreadPoolService poolService = LifeThreadPoolService.getInstance(); poolService.startLiftSchedule(); poolService.checkDeadScheduleThread(); // //fix FixThreadPoolService fixThreadPoolService = FixThreadPoolService.getInstance(); fixThreadPoolService.startFixScheduleThread(); } }
file:
package org.show.server.service.life; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LifeThreadPoolService { private static final Logger logger = LoggerFactory.getLogger(LifeThreadPoolService.class); private static int threadAmount = 10; private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(threadAmount, threadAmount, 0L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), new ThreadFactory() { private final AtomicInteger counter = new AtomicInteger(); public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setName("life Scheduler-" + counter.getAndIncrement()); return t; } }, new RejectedExecutionHandler() { public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { logger.warn("life schedule thread rejected."); } }); private static final LifeThreadPoolService instance = new LifeThreadPoolService(); private LifeThreadPoolService() { } public static LifeThreadPoolService getInstance() { return instance; } public void startLiftSchedule() { for (int i = 0; i < threadAmount; i++) { threadPool.submit(new LifeScheduleThread()); } } public void checkDeadScheduleThread() { new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } int aliveScheduleAmount = threadPool.getActiveCount(); for (; aliveScheduleAmount < threadAmount; aliveScheduleAmount++) { threadPool.submit(new LifeScheduleThread()); } } } }).start(); } }
package org.show.server.service.life; import java.util.Random; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LifeScheduleThread implements Runnable { private static final Logger logger = LoggerFactory.getLogger(LifeScheduleThread.class); @Override public void run() { int time = new Random().nextInt(5000); logger.info("startSignal.countDown"); try { Thread.sleep(time); } catch (InterruptedException e) { } logger.info("thread sleep time "+time); } }
fix:
package org.show.server.service.fix; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; public class FixThreadPoolService { private ExecutorService fixThreadPool = Executors.newFixedThreadPool(3, new ThreadFactory() { private AtomicInteger counter = new AtomicInteger(); @Override public Thread newThread(Runnable r) { return new Thread(r, "fix Test-" + counter.incrementAndGet()); } }); private static final FixThreadPoolService instance = new FixThreadPoolService(); private FixThreadPoolService() { } public static FixThreadPoolService getInstance() { return instance; } public void startFixScheduleThread() { for (int i = 0; i < 3; i++) { fixThreadPool.submit(new FixScheduleThread()); } } }
package org.show.server.service.fix; import java.util.Random; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FixScheduleThread implements Runnable { private static final Logger logger = LoggerFactory.getLogger(FixScheduleThread.class); @Override public void run() { int time = new Random().nextInt(5000); logger.info("startSignal.countDown"); try { Thread.sleep(time); } catch (InterruptedException e) { } logger.info("thread sleep time " + time); } }
供参考的。