java线程池小例子

来源:互联网 发布:js怎么获取a标签的值 编辑:程序博客网 时间:2024/05/04 09:45

最近一直在研究线程池的使用方法,具体线程池工作原理可以参照 前几天写的模拟线程池的例子  java线程池实现方式  java已经有实现好的线程池,并且有完善的管理机制,下面将最近学习体会分享一下。

首先创建一个监控线程来监控线程池的具体资源情况

/**
 * 监控线程
 * @author lizh
 * @date  2014-1-26下午3:57:57
 * @fileName MonitorThread.java
 * @package threadPoolJava
 * @project Test
 */
public class MonitorThread implements Runnable{
    private int delay;//线程监控周期
    private ThreadPoolExecutor executor;//线程池
    private boolean isRun = true;//监控线程是否运行
    public MonitorThread(int delay, ThreadPoolExecutor executor) {
        this.delay = delay;
        this.executor = executor;
    }
    public void shutDown(){
        this.isRun = false;
    }

    @Override
    public void run() {
        while(isRun){
             System.out.println(
                        String.format("[monitor] [%d/%d] Active: %d, Completed: %d, Task: %d, isShutdown: %s, isTerminated: %s",
                            this.executor.getPoolSize(),
                            this.executor.getCorePoolSize(),
                            this.executor.getActiveCount(),
                            this.executor.getTaskCount(),
                            this.executor.getCompletedTaskCount(),
                            this.executor.isShutdown(),
                            this.executor.isTerminated()));
                    try {
                        Thread.sleep(delay*1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
        }
    }
    
}

创建 当任务被拒绝后的处理

/**
 * 处理被线程池拒绝的任务
 * @author lizh
 * @date  2014-1-26下午3:57:33
 * @fileName RejectedExecutionHandlerImpl.java
 * @package threadPoolJava
 * @project Test
 */
public class RejectedExecutionHandlerImpl implements RejectedExecutionHandler{

    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        System.out.println(r.toString()+"is rejected");
        while(executor.getQueue().size()>=5){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        executor.execute(r);
        // 此处可以使用主线程直接将被拒绝的work执行,也可以由上述代码 等线程的任务队列小于最大值时 重新添加到线程池
//        Thread t = new Thread(r);
//        t.start();
    }

}

下面创建任务线程测试类

/**
 * 工作线程
 * @author lizh
 * @date  2014-1-26下午4:01:57
 * @fileName WorkThread.java
 * @package threadPoolJava
 * @project Test
 */
public class WorkThread implements Runnable{
    private String command;
    
    public WorkThread(String command) {
        this.command = command;
    }
    
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"strat");
        processCommand();
        System.out.println(Thread.currentThread().getName()+"end");
    }
    public void processCommand(){
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String toString() {
        return "WorkThread [command=" + command + "]";
    }
    

}

最后创建模拟线程池实用类

/**
 * 测试线程池类
 * @author lizh
 * @date  2014-1-26下午4:01:29
 * @fileName WorkPool.java
 * @package threadPoolJava
 * @project Test
 */
public class WorkPool {
    public static void main(String[] args) {
        RejectedExecutionHandler rejeHandler = new RejectedExecutionHandlerImpl();
        ThreadFactory threadFaction = Executors.defaultThreadFactory();
        ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 4, 10,
                TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5),
                threadFaction, rejeHandler);
        MonitorThread monitor = new MonitorThread(3, pool);
        Thread thread = new Thread(monitor);
        thread.start();
        for (int i = 0; i < 20; i++) {
            WorkThread th = new WorkThread("cmd" + i);
            pool.execute(th);
        }
        try {
            Thread.sleep(7000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        pool.execute(new WorkThread("123"));
        pool.shutdown();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        monitor.shutDown();
    }
}

很简单的小例子运行起来 结果如下


相信看完大家都会明白 尽管任务队列最大为5 允许最大线程数为4  但是21个任务都成功执行  很神奇 一起分享

0 0