线程池 -实现线程复用
线程池:
-
实现线程的复用,无须反复创建线程而消耗过多的资源,提高响应速度
-
可用集合来实现 容器->集合(ArrayList,HashSet,LinkedList< Thread >,HashMap)
原理:
- 当程序第一次启动时,创建多个线程,使用时采用Thread T=list.remove(),即可调用线程
- 同理也可用Thread T=linded.removeFirst();
- 使用完后记得还回线程池,采用list.add()或linked.addLast(t);
- 在JDK1.5后,不用自己创建线程池了,已经内置了
线程池创建
-
java.util.concurrent 类 Executors(执行者) -线程池工厂类
-
利用Executors静态方法创建
static ExecutorService newFixedThreadPool(int nThreads)
创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,在需要时使用提供的 ThreadFactory 创建新线程。返回的是ExecutorService接口的实现类对象,可用其接收(面向接口编程)
ExecutorService接口生成的对象:
- 取线程,调用start方法,执行线程任务用以下方法,内含归还线程
submit(Runnable task)提交一个Runnable任务进行执行
- 关闭/销毁线程
void shutdown()
使用步骤:
- 使用线程池的工厂类Executors里提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池,面向接口编程
ExecutorService exec = Executors.newFixedThreadPool(3);
多态: 接口 =
- 创建一个类,实现Runnable接口,重写run方法,设置线程任务
package cn.learn.thread.ThreadPool;
public class RunnableImpl implements Runnable {
@Override
public void run() {
//获取线程名称
System.out.println(Thread.currentThread().getName()+"创建了新的线程");
}
}
- 调用ExecutorService对象中的方法submit,传递线程任务(实现类),开启线程,执行方法
exec.submit(new RunnableImpl());
- 调用ExecutorService对象中的方法shutdown销毁线程池(不建议执行)
exec.submit(new RunnableImpl());
package cn.learn.thread.ThreadPool;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPool {
public static void main(String[] args) {
//创建线程池,有三个线程
ExecutorService exec = Executors.newFixedThreadPool(3);
//调用ExecutorService对象中的方法submit,传递线程任务(实现类),开启线程,执行方法
exec.submit(new RunnableImpl());
//线程池一直开启,使用完了会归还给线程池
exec.submit(new RunnableImpl());
exec.submit(new RunnableImpl());
//关闭线程池(不建议执行)
exec.shutdown();
//无法再执行,线程池没了,无法获取线程了
//exec.submit(new RunnableImpl());
}
}