Java—线程池

一、对象池、线程池、常量池、数据库中的池子

池的概念:

池是用来约束的,不让程序无节制地创建对象;造成资源浪费

 池的底层是用集合来存储的,对于不经常用的,gc会进行回收


二、线程池(通过线程池,实现Callable接口)

为了不无节制地创建对象,使用线程池


三、使用线程池方式--Runnable接口

  • Executors:线程池创建工厂类
public static ExecutorService newFixedThreadPool(int nThreads):返回线程池对象

  • ExecutorService:线程池类
Future<?> submit(Runnable task):获取线程池中的某一个线程对象,并执行; **值为null的时候表示线程执行完成**
	
Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用

Runnable接口的实现类

public class MyRunnable implements Runnable {

	@Override
	public void run() {
		System.out.println("我要一个教练");
		
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("教练来了: " +Thread.currentThread().getName());
		System.out.println("教我游泳,交完后,教练回到了游泳池");
	}

}

测试类

public class ThreadPoolDemo {
	public static void main(String[] args) {
		//创建线程池对象
		ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象
		//创建Runnable实例对象
		MyRunnable r = new MyRunnable();
		
		//自己创建线程对象的方式
		//Thread t = new Thread(r);
		//t.start(); ---> 调用MyRunnable中的run()
		
		//从线程池中获取线程对象,然后调用MyRunnable中的run()
		service.submit(r);
		//再获取个线程对象,调用MyRunnable中的run()
		service.submit(r);
		service.submit(r);
		//注意:submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭。将使用完的线程又归还到了线程池中

		//关闭线程池
		service.shutdown();
	}
}

四、使用线程池方式—Callable接口

  • Callable接口:与Runnable接口功能相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果,call方法可抛出异常。
  • ExecutorService:线程池类
<T> Future<T> submit(Callable<T> task):获取线程池中的某一个线程对象,并执行线程中的call()方法
Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用

Callable的实现类

import java.util.concurrent.Callable;

public class MyCallable implements Callable<Object>{

	@Override
	public Object call() throws Exception {
		System.out.println("我要一个教练:call");
		Thread.sleep(2000);
		System.out.println("教练来了: " +Thread.currentThread().getName());
		System.out.println("教我游泳,交完后,教练回到了游泳池");

		return null;
	}

}

测试类

public class ThreadPoolDemo {
	public static void main(String[] args) {
		//创建线程池对象
		ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象	

		// 创建Callable对象
		MyCallable c = new MyCallable();
		service.submit(c);
		service.submit(c);
		service.submit(c);
		//注意:submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭。将使用完的线程又归还到了线程池中

		//关闭线程池
		service.shutdown();
	}
}
原文地址:https://www.cnblogs.com/nadou/p/13984174.html