java 线程池

来源:互联网 发布:一不小心买了淘宝爆款 编辑:程序博客网 时间:2024/05/22 01:50
import java.io.Serializable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TestThreadPool_1 {

    /**
     * @param args
     */
    public static void main(String[] args) {

        // 创建线程池
        // ExecutorService exec = Executors.newFixedThreadPool(3);

       

        //改线程池的缓冲队列的长度为3,初始的最小线程数为2个线程,最大的线程数为3

        //当任务进入线程池执行时候:

       //当只有2个任务时,线程池中的初始的2个线程就可以搞定,不需要排队和创建新的线程。

       //当任务数为5时,线程池中的初始的2个线程做2个任务,3个任务在队列中排队。

       //当任务数为6时,线程池中的初始的2个线程做2个任务,3个任务在队列中排队。还有 1个线程,由线程池创建一个新的线程来执行该任务。

       //当线程数大于6时,线程池会丢掉其他的任务。(当然可以使用一些策略来对多的任务进行处理AbortPolicy,CallerRunsPolicy,DiscardPolicy, DiscardOldestPolicy)

      //handler有四个选择:
     //ThreadPoolExecutor.AbortPolicy()
     //抛出java.util.concurrent.RejectedExecutionException异常
      //ThreadPoolExecutor.CallerRunsPolicy()
      //重试添加当前的任务,他会自动重复调用execute()方法
       //ThreadPoolExecutor.DiscardOldestPolicy()
       //抛弃旧的任务
       //ThreadPoolExecutor.DiscardPolicy()
       //抛弃当前的任务

      //以上情况是任务来的很快,线程池中的线程还没有来得急做完任务。如果任务来的比较慢,线程做事情比较快,任务大于6个的话,理论上也是有可能全部做完,不丢失。

        ExecutorService exec = new ThreadPoolExecutor(2, 3, 60L,
                TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(3));

        // 建立6个线程(可以理解为6个任务)
        for (int index = 0; index < 6; index++) {
            String task = "task@ " + index;
            System.out.println("put " + task);
            exec.execute(new ThreadPoolTask(task));
            /*try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/
        }

        // 关闭
        exec.shutdown();

    }

    public static class ThreadPoolTask implements Runnable, Serializable {
        private static final long serialVersionUID = 0;
        // 保存任务所需要的数据
        private Object threadPoolTaskData;

        ThreadPoolTask(Object tasks) {
            this.threadPoolTaskData = tasks;
        }

        public void run() {
            // 处理一个任务,这里的处理方式太简单了,仅仅是一个打印语句
            System.out.println("start .." + threadPoolTaskData);
            try {
                // // 便于观察,等待一段时间
//                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            threadPoolTaskData = null;
        }
    }
}
原创粉丝点击