Java多线程2.7.线程池1-ExecutorService对象-Runnable接口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cmm0401/article/details/82716504

线程池

1、线程池的概述

  • 程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。
  • 线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
  • JDK5之前,我们必须手动实现自己的线程池。从JDK5开始,Java内置支持线程池。

2、JDK5中的线程池

  • JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法:
    • public static ExecutorService newCachedThreadPool()
    • public static ExecutorService newFixedThreadPool(int nThreads)
    • public static ExecutorService newSingleThreadExecutor()
  • 这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了如下方法:
    • Future<?> submit(Runnable task)
    • <T> Future<T> submit(Callable<T> task)
  • 案例演示
    • 创建线程池对象
    • 创建Runnable实例
    • 提交Runnable实例
    • 关闭线程池
  • public static ExecutorService newCachedThreadPool()
    • 创建一个具有缓存功能的线程池。缓存:百度浏览过的信息再次访问
  • public static ExecutorService newFixedThreadPool(int nThreads)
    • 创建一个可重用的,具有固定线程数的线程池
  • public static ExecutorService newSingleThreadExecutor()
    • 创建一个只有单线程的线程池,相当于上个方法的参数是1

3、线程池的案例演示

(1)创建一个实现Runnable接口的线程类

package cn.itcast_08;
public class MyRunnable implements Runnable {
	@Override
	public void run() {
		for (int x = 0; x < 100; x++) {
			System.out.println(Thread.currentThread().getName() + ":" + x);
		}
	}

}

(2)测试线程池

package cn.itcast_08;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/*
 * 线程池的好处:线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
 * 
 * 如何实现线程的代码呢?
 * 		A:创建一个线程池对象,控制要创建几个线程对象。
 * 			public static ExecutorService newFixedThreadPool(int nThreads)
 * 		B:这种线程池的线程可以执行:
 * 			可以执行Runnable对象或者Callable对象代表的线程
 * 			做一个类实现Runnable接口。
 * 		C:调用如下方法即可
 * 			Future<?> submit(Runnable task)
 *			<T> Future<T> submit(Callable<T> task)
 *		D:我就要结束,可以吗?
 *			可以。
 */
public class ExecutorsDemo {
	public static void main(String[] args) {
		// 创建一个线程池对象,控制要创建几个线程对象。
		// public static ExecutorService newFixedThreadPool(int nThreads)
		ExecutorService pool = Executors.newFixedThreadPool(2);

		// 可以执行Runnable对象或者Callable对象代表的线程
		pool.submit(new MyRunnable());
		pool.submit(new MyRunnable());

		//结束线程池
		pool.shutdown();
	}
}

猜你喜欢

转载自blog.csdn.net/cmm0401/article/details/82716504