选择线程池的理由
频繁的创建与销毁需要实时间
线程池概述
程序启动个新线程的成本是比较高的,因为涉及到要操作系统交互,当要创建大量的运行时间很短的线程时,线程池的特性就很适合:不用的线程不会杀死而是作为空闲状态放进线程池里,等待下一个对象来使用。JDK5之前需要手动实现自己的线程池,之后java支持内置线程池。
内置线程池的使用概述
JDK5新增了一个Executor工厂类类产生线程池,有如下两个方法。
public static ExecutorService newFixedThredpool(int i)
public static ExecutorService newStringThreadExecutor()
这些方法的返回值是 ExecutorService 对象,该对象表示一个线程池,该线程池对象可以执行Runnable 和Callable 对象代表的课程,他提供了如下方法。
Future<?> submit(Runnable task)
<T>Future<T> submit(Callable<T> task)
使用步骤
创建线程池对象
创建Runnable实例
提交Runnable示例
关闭线程池 pool.sutdown();
使用线程池
常用方法
public static ExecutorService newFixedThreadPool(int nThreads) :返回线程池对象。(创建的是有界线 程池,也就是池中的线程个数可以指定最大数量)
public Future<?> submit(Runnable task) :获取线程池中的某一个线程对象,并执行
使用线程池
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadpoolDemo {
public static void main(String[] args) {
//1.创建线程池对象
ExecutorService pool = Executors.newFixedThreadPool(3);
//2.创建多线程任务
MyRunnable myRunnable = new MyRunnable();
pool.submit(myRunnable);
pool.submit(myRunnable);
pool.submit(myRunnable);
}
}
class MyRunnable implements Runnable{
int i = 0;
@Override
public void run() {
for(;;){
synchronized (this){
System.out.println("这是第"+ i++ +"次运行" +"-->"+ Thread.currentThread().getName());
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
线程池
提供和了一个线程队列,队列中保存着所有等待状态的线程。避免了穿件与销毁的额外开销,提高了响应速度。
线程池的体系结构
java.util.concurrent.Executor【负责线程的调度和使用的根接口】
|--ExecutorService【线程池主要接口】
|----ThreadPoolExecutor【线程池实现类】
|----ScheduledExecutorService【子接口:负责线程的调度】
|--------ScheduledThreadPoolExecutor【继承ThreadPoolExecutor实现ScheduledExecutorService】
创建线程池----4种不同的线程池
/**
* 创建缓存线程池 池中线程数量不固定,因需变化
*/
ExecutorService cachedPool = Executors.newCachedThreadPool();
/**
* 创建固定(线程数)大小的线程池
*/
ExecutorService executorService = Executors.newFixedThreadPool(1);
/**
* 创建单个线程的线程池(池中只有一个线程)
*/
ExecutorService singledPool = Executors.newSingleThreadExecutor();
/**
* 创建固定大小的线程池,可以延迟或者定时执行任务
*/
ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(1);
线程调度----(用以上一种随便举个例子)
class ScheduledPoolDemo {
public static void main(String[] args) {
//创建固定大小的线程池,可以延迟或者定时执行任务
ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);
//参数:任务,数字,数字单位
pool.schedule(new Task(),1, TimeUnit.SECONDS);
pool.schedule(new Task(),1, TimeUnit.SECONDS);
pool.schedule(new Task(),1, TimeUnit.SECONDS);
pool.schedule(new Task(),1, TimeUnit.SECONDS);
pool.schedule(new Task(),1, TimeUnit.SECONDS);
//温和关闭线程
pool.shutdown();
}
}
class Task implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " : " + (int) (Math.random() * 101));
}
}
网友评论