JAVA 线程池使用

来源:互联网 发布:淘宝企业开店店铺名称 编辑:程序博客网 时间:2024/06/09 20:09

在java中,创建一个线程执行任务可以用以下方法:

Runnable task = new Runnable() {@Overridepublic void run() {//do sth.}};new Thread(task).start();
如果只执行一个任务,那么这样很方便,但是对大量的任务来说这样是低效的,因为需要为每个Runnable任务创建一个线程来执行。

如果程序中创建了大量生命周期很短的线程,应该使用线程池。线程池中包含许多准备运行的空闲线程,执行完任务后,线程不会死亡,而是准备为下一个请求提供服务,使用线程池可以减少并发线程的数量。

Java提供Executor接口来执行线程池中的任务,它的子接口ExecutorService用于管理任务,Executors类提供了一些静态工厂方法用来构建线程池。



Executors类一些常用方法:

newCachedThreadPool:创建线程池包含必要的线程数量,当之前创建的线程可用时,会重用,如果没有可用的线程,将创建新的线程。空闲的线程将会保留60秒。线程池中的线程数没有上限。

newFixedThreadPool:创建固定数量上限的线程池,空闲线程会一直保留直到调用shutdown。当提交的任务超过了线程上限,线程池中的线程都在执行时,多余的任务处于等待状态。

newSingleThreadExecutor:创建只包含一个线程的线程池,这个线程按照提交顺序执行每个任务。

newScheduledThreadPool:创建一个可以在一定时间后执行任务的线程池。

newSingleThreadScheduledExecutor:创建一个包含一个线程的,可以在一定时间后执行任务的线程池。


newCachedThreadPool:

public class ThreadTest {public static void main(String[] args) {Runnable r1 = new NewRunnable("1");Runnable r2 = new NewRunnable("2");Runnable r3 = new NewRunnable("3");ExecutorService executorService = Executors.newCachedThreadPool();executorService.execute(r1);executorService.execute(r2);executorService.execute(r3);}}class NewRunnable implements Runnable {private String name;public NewRunnable(String name) {this.name = name;}@Overridepublic void run() {System.out.println("Runnable:" + name);}}
输出:

Runnable:1
Runnable:3
Runnable:2


newFixedThreadPool:

ExecutorService executorService = Executors.newFixedThreadPool(2);executorService.execute(r1);executorService.execute(r2);executorService.execute(r3);
输出:
Runnable:1
Runnable:3
Runnable:2


newSingleThreadExecutor:

Runnable r1 = new NewRunnable("1");Runnable r2 = new NewRunnable("2");Runnable r3 = new NewRunnable("3");ExecutorService executorService = Executors.newSingleThreadExecutor();executorService.execute(r1);executorService.execute(r2);executorService.execute(r3);
输出:
Runnable:1
Runnable:2
Runnable:3
注意,这里任务是按照execute的提交顺序执行的。


0 0
原创粉丝点击