什么是线程池
一个用来建立线程和管理线程的容器对象。
线程池的好处
减少资源的消耗,避免频繁的创建与摧毁线程(因为创建线程需要资源)
提高程序的响应速度 (程序运行速度更加快)
提高线程的可管理性(需要线程的时候不用创建,直接找线程池要)
如何获得线程
通过Executors类的静态方法来获取线程池对象,
//通过Executers的静态方法newFixedThreadPool获取指定线程数量的线程池 3表示我获取的这个线程池里面只有3个线程 ExecutorService executorService = Executors.newFixedThreadPool(3);
ExecutorService接口的经用方法介绍
Future<?> submit(Runnable task) 提交一个Runnable任务 Future<T> submit(Callable<T> task) 提交一个Callable任务 void shutdown() 销毁这个线程池,要等所有线程执行完成任务才销毁 void shutdownNow(); 销毁这个线程池,不管有没有线程在执行任务,调用该方法立即销毁
submint重载方法区别
参数区别
第一个方法参数为一个Runnable接口实现类,抽象方法为run方法没有返回值
第二个方法参数为一个Callable接口实现类,抽象方法call方法有返回值
方法返回值区别
如果调用submint方法传入的参数为Runnable实现类一般不接收方法的返回值
如果调用submint方法传入的参数为Callable的实现类一般接收方法的返回值
submint方法什么时候传入Runnable的实现类什么时候传入Callable的实现类
当你运行的这个线程有返回值就使用传入Callable接口实现类的那个方法,当你运行的那个线程没有返回值就使用传入Runnable接口实现类的那种方式,因为传入的参数为Callable的实现类我们可以通过submint方法的返回值获取到那一个线程的返回值。
使用线程池代码
public static void main(String[] args) throws ExecutionException, InterruptedException { //通过Executers的静态方法newFixedThreadPool获取指定线程数量的线程池 3表示我获取的这个线程池里面只有3个线程 ExecutorService executorService = Executors.newFixedThreadPool(3); //开启一个线程 线程执行Runnable接口实现类里面的代码 executorService.submit(new Runnable() { @Override //重写run方法 public void run() { for (int i = 0; i < 10; i++) { System.out.println("run方法" +i); } } }); //开启线程 线程执行Callable实现类里面的代码 泛型为call方法的返回值类型 Future<Integer> submit = executorService.submit(new Callable<Integer>() { @Override //重写call方法 public Integer call() throws Exception { for (int i = 0; i < 10; i++) { System.out.println("call方法 " + i); } //方法返回0 return 0; } }); //获取并打印call方法的返回值 System.out.println(submit.get()); }
使用lambda表达式作为参数参数传入submit方法
public static void main(String[] args){ //获取一个线程池对象,并且设置线程池里面的线程数量为5 ExecutorService executorService = Executors.newFixedThreadPool(5); //获取一个线程执行任务 参数为runnable的lambert表达式表现形式 executorService.submit(()->{ for (int i = 0; i < 10; i++) { System.out.println("run方法 " +i); } }); // 方法返回值泛型为call方法的返回值类型 获取一个线程执行任务 参数为Callable实现类的lambert表达式的表现形式 Future<Integer> future = executorService.submit(()->{ for (int i = 0; i < 10; i++) { System.out.println("call方法 " +i); } //返回一个2 return 2; }); //获取并打印call方法的返回值 System.out.println(future); }