线程池

 

ThreadPoolExecutor 核心参数 corePoolSize,  QueueCapacity(ArrayBlockingQueue的参数),  maxPoolSize

1 If the number of threads is less than the corePoolSize, create a new Thread to run a new task.
2 If the number of threads is equal (or greater than) the corePoolSize, put the task into the queue.
3 If the queue is full, and the number of threads is less than the maxPoolSize, create a new thread to run tasks in.
4 If the queue is full, and the number of threads is greater than or equal to maxPoolSize, reject the task, may throws exception.

 

使用有界队列ArrayBlockingQueue,设定队列元素个数,避免OOM。 

 

异步执行不阻塞 execute(xxx)

ExecutorService executeService = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));

executeService.execute(new MyRunner()); // execute

 

异步阻塞, 设置线程名 submit(xxxx)

    public static void main(String[] args) throws Exception {

        Collection<Future<?>> futures = new LinkedList<Future<?>>();
        ExecutorService executeService = new ThreadPoolExecutor(3, 6, 0L, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(2), new CustomThreadFactory());

        for (int i = 0; i < 1; i++) {
            futures.add(executeService.submit(new MyRunner()));
        }

        for (Future<?> future : futures) {
            future.get(); // 阻塞,主线程等待线程结束
        }

        System.out.println("......done...........");
    }



    /**
     * 设置线程名
     *
     */
    private static class CustomThreadFactory implements ThreadFactory {
        private static final AtomicInteger threadNumber = new AtomicInteger(1);

        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            String threadName = "ley's thread" + threadNumber.getAndIncrement() + " " + t.hashCode();
            t.setName(threadName);
            return t;
        }
    }


    public static class MyRunner implements Runnable {

        @Override
        public void run() {

            System.out.println("current thread==>:" + Thread.currentThread().getName());
            while (true) {
                if (Thread.currentThread().getName().contains("ley's thread2")) {
                    int i = 1;
                    int j = 0;
                    int k = i / j;
                }
            }
        }
    }

 

posted @ 2019-04-02 16:29  webglcn  阅读(131)  评论(0编辑  收藏  举报