本文共 3651 字,大约阅读时间需要 12 分钟。
为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效进行线程控制。他们都在java.util.concurrent包中,是JDK并发包的核心。其中有一个比较重要的类Executors,他扮演线程工厂的角色,我们通过Executors可以创建特定功能的线程池,Executors创建线程池的方法:
public class Temp extends Thread { public void run(){ System.out.println("run"); } public static void main(String[] args) { Temp command = new Temp(); ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); //表示command这个任务在初始化时延迟1s钟并且每隔3s钟轮询command的run方法 ScheduledFuture scheduleTask = scheduler.scheduleWithFixedDelay(command, 1, 3, TimeUnit.SECONDS); }}
若Executors工厂类无法满足我们的需求,可以自己去取创建自定义线程池,其实Executors工厂类里面的创建线程方法其内部实现均是使用了ThreadPoolExecutor这个类,这个类可以自定义线程池。构造方法如下:
public ThreadPoolExector(int corePoolSize,//核心线程数,即初始化时有多少个线程 int maximumPoolSize,//最大线程数 long keepAliveTime,//线程池中每一个线程的空闲时间 TimeUnit unit,//线程空闲时间单位 BlockingQueueworkQueue,//当线程池已满时其他线程存放的队列 ThreadFactory threadFactory, RejectedExecutionHandler handler//队列已满时的拒绝策略){...}
ThreadPoolExector构造方法对于队列是什么类型比较关键:
JDK拒绝策略:
如果需要自定义拒绝策略可以实现RejectedExecutionHandler接口。
public class UseThreadPoolExecutor1 { public static void main(String[] args) { ThreadPoolExecutor pool = new ThreadPoolExecutor( 1, //coreSize 2, //MaxSize 60,//60 TimeUnit.SECONDS, new ArrayBlockingQueue(3),//指定有界队列 new MyRejected());//自定义拒绝策略 MyTask mt1 = new MyTask(1, "任务1"); MyTask mt2 = new MyTask(2, "任务2"); MyTask mt3 = new MyTask(3, "任务3"); MyTask mt4 = new MyTask(4, "任务4"); MyTask mt5 = new MyTask(5, "任务5"); MyTask mt6 = new MyTask(6, "任务6"); pool.execute(mt1); pool.execute(mt2); pool.execute(mt3); pool.execute(mt4); pool.execute(mt5); pool.execute(mt6); pool.shutdown(); }}
public class MyTask implements Runnable { private int id; private String name; public MyTask(int id, String name){ this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void run() { try { System.out.println("run taskId = " + this.getId()); Thread.sleep(5*1000); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public String toString() { return this.getId() + " : " + this.getName(); }}
public class MyRejected implements RejectedExecutionHandler { /** * @param paramRunnable 当前任务对象 * @param paramThreadPoolExecutor 当前线程池对象 * */ @Override public void rejectedExecution(Runnable paramRunnable, ThreadPoolExecutor paramThreadPoolExecutor) { System.out.println("自定义拒绝策略..."); System.out.println("当前被拒绝的任务为:" + paramRunnable.toString()); }}
转载地址:http://jbkni.baihongyu.com/