JavaSE---多线程---线程池

一、概述

    1、系统启动一个新的线程成本比较高,因为它涉及与OS交互;尤其是程序中需要大量生存期很短的线程时,更应该需要使用线程池;

    2、线程池在系统启动时创建大量的空闲线程,程序将一个Runnable对象传递给线程池,线程池会启动一条线程来执行该Runnable对象的run方法;

      当run方法结束后,该线程不会死亡,而是再次回到线程池中处于空闲状态,等待执行下一个Runnable对象的run方法;

    3、使用线程池也可以有效地控制系统中并发线程的数量;

    4、JDK1.5之前,开发者需要自己手动实现线程池;

      JDK1.5之后,Java内建支持线程池;

    5、JDK1.5后,Java提供了Executors工厂类来生产线程池:

          

              前3个方法将返回一个ExecutorService对象,该对象代表一个线程池,可以执行Runnable对象、Callable对象代表的线程;

                  

    6、当一个线程池使用完后,必须调用shutdown(),启动该线程池的关闭序列,不再接受新任务,将之前已提交的任务执行完成;  

    7、使用线程池开启线程

          7.1  使用Executors类创建一个ExecutorService对象;

          7.2  创建Runnable接口实现类或Callable实现类;

          7.3  调用ExecutorService对象的submit来提交Runnable实现类实例或Callable实现类实例;

          7.4  关闭线程池;

package com.an;

import java.util.concurrent.*;

public class ThreadPoolTest {
    /**
     * Runnable实现类
     */
    static class RunnableImpl implements Runnable{
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }

    /**
     * Callable实现类
     */
    static class CallableImpl implements Callable{
        public Object call() throws Exception {
            return Thread.currentThread().getName();
        }
    }

    public static void main(String[] args)throws Exception{
        ExecutorService executorService =Executors.newFixedThreadPool(3);
        executorService.submit(new RunnableImpl());
        Future future =executorService.submit(new CallableImpl());
        System.out.println(future.get());
        executorService.shutdown();
    }
}

  

猜你喜欢

转载自www.cnblogs.com/anpeiyong/p/11023790.html
今日推荐