Java多线程之~~~使用ThreadPoolExecutor来创建线程
以前我们创建线程的时候都是主动的new一个Thread,然后调用他们的start方法,但是如果线程非常多,任务也非
常多的时候,这样写就会显得非常麻烦,当然可能效率也不是很高,Java给我们提供了叫线程创建器这个样概念的类,
他可以帮助我们管理这些线程,你做的就是编写好代码,然后交给他,她就会自动帮你运行。
当然,带cache的threadpool 对于死掉的线程重新调用,在性能上也会有非常好的表现,但是不能将太多的线程交
给他管理,否则就会把系统拖垮,下面我们来做一个例子。
package com.bird.concursey.charpet6; import java.util.Date; import java.util.concurrent.TimeUnit; public class Task implements Runnable { // store the creation date of the task private Date initDate; // store the name of the task private String name; public Task(String name) { this.initDate = new Date(); this.name = name; } @Override public void run() { System.out.printf("%s: Task %s: Created on: %s\n", Thread .currentThread().getName(), name, initDate); System.out.printf("%s: Task %s: Started on: %s\n", Thread .currentThread().getName(), name, new Date()); try { Long duration = (long) (Math.random() * 10); System.out.printf("%s: Task %s: Doing a task during %d seconds\n", Thread.currentThread().getName(), name, duration); TimeUnit.SECONDS.sleep(duration); } catch (InterruptedException e) { e.printStackTrace(); } System.out.printf("%s: Task %s: Finished on: %s\n",Thread. currentThread().getName(),name,new Date()); } }
package com.bird.concursey.charpet6; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; /** * execute every task it receives using an executor * * @author bird 2014年9月23日 下午9:03:01 */ public class Server { private ThreadPoolExecutor executor; public Server() { executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(); } public void executeTask(Task task) { System.out.printf("Server: A new task has arrived\n"); executor.execute(task); System.out.printf("Server: Pool Size: %d\n", executor.getPoolSize()); System.out.printf("Server: Active Count: %d\n", executor.getActiveCount()); System.out.printf("Server: Completed Tasks: %d\n", executor.getCompletedTaskCount()); } public void endServer() { executor.shutdown(); } public static void main(String[] args) { Server server = new Server(); for(int i = 0; i < 100; i++) { Task task = new Task("Task" + i); server.executeTask(task); } server.endServer(); } }
如果有大量的线程进入,他会给每一个线程创建一个对象,这样就会令系统不堪重负,Executors提供了一种构造方
法,设置一个最大量,如果创建的线程数量超过了这个数量,Executors就不会再去创建这个线程,等待已经在线程池
里面的线程运行完了,有空闲的位置了才去继续创建新线程,这样就会让系统变的健壮。
上面的代码都不需要该,我们只需要在构造函数的地方重新实例化一个 代码如下
public Server() { executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5); }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。