对单个线程来说,它只有一次生命周期,即一次 start
反复使用 start 方法会被 JVM 报错
对于需要反复使用的线程,如果反复创建会很慢,可以通过线程池解决
1.线程池的概念
线程池可以理解为一个容器 (集合)
程序启动时,实例化这个集合,每次需要线程时,就从集合中拿出来(删除)一个
当线程用完后,把线程归还(添加)到集合
2.线程池工厂类
在 JDK 1.5 之后,JDK 内置了线程池类,即线程池的工厂类
1.导包
import java.util.concurrent.Executors;
2.静态方法
创建一个线程池
public static ExecutorService newFixedThreadPool(int nThreads);
其中的 ExecutorService 是线程池接口,int 参数是线程池容量
3.线程池接口类
线程池接口的实现类,可以当作接口类使用
1.导包
import java.util.concurrent.ExecutorService;
2.方法
1.从线程池获取线程,并启动
submit(Runnable task)
2.关闭/销毁线程
void shutdown()
4.线程池的使用步骤
1.使用线程池工厂的newFixedThreadPool方法,创建含有指定数量的线程池
ExecutorService es = Executors.newFixedThreadPool(2);
2.创建一个含有 Runnable 接口的类,即创建一个线程类(假设为 RunnableImpl)
3.调用线程池接口类中的 submit 方法,传递刚才的 Runnable 线程类
es.submit(new RunnableImpl());//每次传递占用一个线程池,
es.submit(new RunnableImpl()); //用完会自动归还线程池,
es.submit(new RunnableImpl()); //可多次调用
4.调用线程池接口类的 shutdown 方法,销毁线程池(销毁后无法再调用线程)