两类线程池:存放着固定数量的线程,如果一些线程死亡时,线程池立马自动补齐,下面(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);
}
}
供参考的。
转载于:https://blog.51cto.com/jusole/1402956