一、什么是线程池:
线程池就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后再创建线程后自动启动这些任务。
不废话,直接代码
1、编写任务类,实现Runnable接口
2、编写线程类,用于执行任务,需要持有所有任务
3、编写线程池类,包含提交任务,执行任务的能力
4、编写测试类,创建线程池对象,提交多个任务测试
任务类
/* * @Author 吕习伟 * @Date 22:25 2020/8/18 * @Param * @return * @Description 任务类 任务编号,任务执行时间 **/ public class MyTask implements Runnable{ private int task_id; public MyTask(int task_id) { this.task_id = task_id; } @Override public void run() { String name = Thread.currentThread().getName(); System.out.println("线程:"+name+"即将执行任务:"+task_id); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程:"+name+"完成任务:"+task_id); } @Override public String toString() { return "MyTask{" + "task_id=" + task_id + '}'; } }
线程类
import java.util.List; /* * @Author 吕习伟 * @Date 22:30 2020/8/18 * @Param * @return * @Description 编写一个线程类 **/ public class MyWork extends Thread{ private String name; private List<Runnable> tasks; public MyWork(String name,List<Runnable> tasks) { super(name); this.tasks = tasks; } @Override public void run() { //判断集合中是否又任务,只要有任务就一直执行任务, while (tasks.size()>0){ Runnable r = tasks.remove(0); r.run(); } } }
线程池类
import java.util.Collections; import java.util.LinkedList; import java.util.List; public class MyThreadPool { //任务队列,集合形式,需要控制线程全局安全问题 private List<Runnable> tasks = Collections.synchronizedList(new LinkedList<>()); //当前线程数量 private int num; //核心线程数量 private int corePoolSize; //最大线程数量 private int maxPoolSize; //任务队列的长度 private int workSize; public MyThreadPool(int corePoolSize, int maxPoolSize, int workSize) { this.corePoolSize = corePoolSize; this.maxPoolSize = maxPoolSize; this.workSize = workSize; } //提交任务方法 public void submit(Runnable r){ //判断任务的数量是否超出了做大任务数量 if (tasks.size() >= workSize){ System.out.println("队列已经满了,任务:"+r+"被丢弃了。。。。"); }else { tasks.add(r); //执行任务 execTask(r); } } // 执行任务 private void execTask(Runnable r) { //判断线程池中的线程总数量,是否超出核心线程数, if (num < corePoolSize){ new MyWork("核心线程:"+num,tasks).start(); num++; }else if (num <maxPoolSize){ new MyWork("非核心线程:"+num,tasks).start(); num++; }else { System.out.println("任务:"+r+"被缓存了。。。。"); } } }
测试
public class MyTest { public static void main(String[] args) { MyThreadPool pool = new MyThreadPool(2,4,20); for (int i = 0; i <100; i++) { MyTask task = new MyTask(i); pool.submit(task); } } }