线程池的使用
线程池的使用:给它一个任务,然后从线程池中获取线程,让这个线程来执行这个任务
main方法
package ThreadPool;/*
*@author wanghongyuan
*@Create 2021/1/7 21:01
*/
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/*
JDK1.5之后提供的
java.util.concurrent.Executors:线程池工厂类,用来生产线程池
Executors类中的静态方法:
static ExecutorService newFixedThreadPool(int nTreads)创建一个可重用固定线程数的线程池
参数:
int nThread:创建线程池中包含的线程数量
返回值:
ExecutorService接口类型,返回的是ExecutorService接口的实现类对象,我们可以使用ExecutorService接口接收(面向接口编程)
java.util.concurrent.ExecutorService:线程池接口
用来从线程池中获取线程,调用start方法,执行线程任务
submit(Runnable task)提交一个Runnable任务用于执行
关闭/销毁线程池的方法
void shutdown()
线程池的使用步骤:
1.使用线程池的工厂类Executors里面提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池。
2.创建一个类,实现Runnable接口,重写run方法,设置线程任务
3.调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法
4.如果我不想用这个线程池了,我们可以销毁/关闭这个线程池,调用ExecutorService中的方法shutdown销毁线程池。(不建议使用)
*/
public class Demo01ThreadPool {
public static void main(String[] args) {
//1.使用线程池的工厂类Executors里面提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池。
ExecutorService es = Executors.newFixedThreadPool(3);
//3.调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法
es.submit(new RunnableImpl());//pool-1-thread-2创建了一个新的线程
// 线程池会一直开启,使用完了线程,会自动把线程归还给线程池,线程可以继续使用
es.submit(new RunnableImpl());//pool-1-thread-1创建了一个新的线程
es.submit(new RunnableImpl());//pool-1-thread-1创建了一个新的线程
es.submit(new RunnableImpl());//pool-1-thread-1创建了一个新的线程
es.submit(new RunnableImpl());//pool-1-thread-2创建了一个新的线程
es.submit(new RunnableImpl());//pool-1-thread-3创建了一个新的线程
// 线程池不想用了可以使用shutdown();
es.shutdown();
/*
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@b1bc7ed[Not completed, task = java.util.concurrent.Executors$RunnableAdapter@1ddc4ec2[Wrapped task = ThreadPool.RunnableImpl@133314b]] rejected from java.util.concurrent.ThreadPoolExecutor@7cd84586[Shutting down, pool size = 3, active threads = 3, queued tasks = 3, completed tasks = 0]
at java.base/java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2057)
at java.base/java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:827)
at java.base/java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1357)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118)
*/
es.submit(new RunnableImpl());//抛异常,线程池都没有了,就不能获取线程了
}
}
Runnable实现类
package ThreadPool;/*
*@author wanghongyuan
*@Create 2021/1/7 21:28
*/
//2.创建一个类,实现Runnable接口,重写run方法,设置线程任务
public class RunnableImpl implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"创建了一个新的线程");
}
}