线程:
CPU调度和分配的最小单位,基本不浪费系统资源,只占用少数程序必备的资源。
上篇文章说了前三种方式,下面来说最后一种:
线程池方式创建线程:
为什么要用线程池:
如果并发量很多,并且每个线程都是执行时间很短就结束了,频繁的创建和销毁线程是非常消耗时间的。所以出现了线程池.
线程池:
执行完任务后,并不销毁,而是重新回到线程池内,等待下个任务,跟数据库连接池一样。
线程池使用规则:
1.工厂原本10个工人(有效线程),每个人只能做一件任务
2.当有任务来了,就分配给工人去做。(分配线程)
3.当10个工人都在做任务的时候,还来了任务,就放在等待队列中
如果新增任务的速度远远大于工人做任务的速度,就得有补救措施,招聘4个临时工(线程扩展)
4.如果14个工人的速度还是不够,那就考虑不在接受任务了(超过了最大连接数)
等14个工人有空闲的时候,并且任务增长速度较慢,就会考虑辞掉4个临时工,毕竟额外请工人要花钱(把扩展线程销毁)
创建线程实现方式:
1. 定长线程池:
package com.jym.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @program: thread
* @description: 线程池测试类
* @author: jym
* @create: 2020/01/27
*/
public class TestThreadPool {
public static void main(String[] args) {
// 创建线程池 定长的线程池
ExecutorService pool = Executors.newFixedThreadPool(5);
// 将线程交给线程池来管理
PoolDemo poolDemo = new PoolDemo();
for(int i=0,j=5;i<j;i++){
pool.submit(poolDemo);
}
// 关闭
pool.shutdown();
}
}
class PoolDemo implements Runnable{
public void run() {
for (int i = 0, j=10;i<j;i++){
System.out.println("线程"+Thread.currentThread().getName()+"跑啦");
}
}
}
2.定时线程池:
package com.jym.thread;
import java.util.concurrent.*;
/**
* @program: thread
* @description: 定时的线程池测试类
* @author: jym
* @create: 2020/01/27
*/
public class SchedulePoolTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 线程大小为5个
ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);
// 调用schedule方法,第一个参数为callable实现类,第二个为时间间隔,第三个为时间单位
for(int i=0; i<5; i++ ){
ScheduledFuture<Integer> scheduledFuture = pool.schedule(new Callable<Integer>() {
public Integer call() throws Exception {
int sum = 0;
for(int j=0;j<10;j++){
sum += j;
}
return sum;
}
},1,TimeUnit.SECONDS);
System.out.println(scheduledFuture.get());
}
pool.shutdown();
}
}