6.4 线程池
6.4.1 线程池 理解
- 背景:我们经常会创建和销毁、使用量特别大的资源,比如并发情况下的线程。这会对性能造成较大的影响。
比如创建 一万个线程 跑 一句话。就好比 你买了 一万个 交通设备,然后 去 一个地方一样,是很没必要的!
- 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完再放回池子中。(何乐而不为呢?)
线程池 可以避免频繁创建和销毁线程!!实现重复利用!!这就类似于 咱们生活中的 公共交通工具呀 ~
- 好处:
提高响应速度(减少了创建新线程的时间)
降低资源消耗(重复利用线程池中的线程,不需要每次都创建)
便于线程的管理(…)
corePoolSize:核心池的大小
maximumPoolSize:最大线程数
keepAliveTime:线程没有任务时最多保持多长时间后会终止
6.4.2 线程池 使用
-
JDK 5.0 起 就提供了 线程池的 相关 API:ExecutorService(执行服务),就是我们之前 用 Callable 接口的时候 用到的 一个 东西。 还有 Executors。
-
ExecutorService:真正的线程池接口。
-
ThreadPoolExecutor:线程池接口的实现类。(暂时不讲,不学习,JUC 的时候 才会 针对于 线程池 展开 疯狂的 学习!!!)
void execute(Runnable command):执行任务/命令,没有返回值,一般用来 执行 Runnable。
<T>Future<T>submit(Callabel<T>task):执行任务,有返回值,一般用来执行 Callable。
void shutdown():关闭连接池
- Executors:工具类、线程池的工厂类,是用于创建并返回不同类型的线程池的!<非常的重要!!>
切记:是 Executors 不是 Executor 别打字打错了,差这一个 字母 差很多的!!!
- Runnable 线程池 调用:
package www.muquanyu.Seniorpart;
import sun.nio.ch.ThreadPool;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
public class 线程池 {
public static void main(String[] args) {
//直奔主题 创建一个线程池
//参数为 池子的 大小
ExecutorService executorService = Executors.newFixedThreadPool(10);
//往里面 扔 事务,自然就有 线程去接应
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.submit()
//2.关闭 链接
executorService.shutdown();
}
}
class MyRunnable implements Runnable {
@Override
public void run(){
for(int i = 0;i < 10;++i)
{
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
}
- Callable 线程池 调用:
package www.muquanyu.Seniorpart;
import sun.nio.ch.ThreadPool;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
public class 线程池 {
public static void main(String[] args) {
//直奔主题 创建一个线程池
//参数为 池子的 大小
ExecutorService executorService = Executors.newFixedThreadPool(10);
//往里面 扔 事务,自然就有 线程去接应
//executorService.execute(new MyRunnable());
//executorService.execute(new MyRunnable());
// executorService.execute(new MyRunnable());
//executorService.execute(new MyRunnable());
executorService.submit(new MyCallable());
executorService.submit(new MyCallable());
executorService.submit(new MyCallable());
executorService.submit(new MyCallable());
//2.关闭 链接
executorService.shutdown();
}
}
class MyRunnable implements Runnable {
@Override
public void run(){
for(int i = 0;i < 10;++i)
{
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
}
class MyCallable implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
for(int i = 0;i < 10;++i)
{
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
return true;
}
}