线程任务代码:
import java.text.SimpleDateFormat;import java.util.Date;/** * 线程任务 */public class Task implements Runnable{ private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); private String initDate; private String name; public Task(String name) { this.name = name; initDate = sdf.format(new Date()); System.out.println("创建任务 -> TaskName:" + name + ",initDate:" +initDate); } public void run() { System.out.println("执行任务-> TaskName:" + name + ",date:" + sdf.format(new Date())); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("完成任务-> TaskName:" + name + ",date:" + sdf.format(new Date())); } @Override public String toString() { return "Task [initDate=" + initDate + ", name=" + name + "]"; }}
import java.util.concurrent.Executors;import java.util.concurrent.ThreadPoolExecutor;/** * 线程执行者 * 缓存线程池: 已创建的缓存线程池,当需要执行新的任务会创建新的线程, * 如果它们已经完成运行任务,变成可用状态,会重新使用这些线程。 * 线程重复利用的好处是,它减少线程创建的时间。 * 缓存线程池的缺点是,为新任务不断创建线程, 所以如果你提交过多的任务给执行者,会使系统超载。 * * ThreadPoolExecutor 类和一般执行者的一个关键方面是,你必须明确地结束它。 * 如果你没有这么做,这个执行者会继续它的执行,并且这个程序不会结束。 * 如果执行者没有任务可执行, 它会继续等待新任务并且不会结束它的执行。 * 一个Java应用程序将不会结束,除非所有的非守护线程完成它们的执行。所以,如果你不结束这个执行者,你的应用程序将不会结束。 */public class Server { private ThreadPoolExecutor executor; public Server() { executor = (ThreadPoolExecutor) Executors.newCachedThreadPool(); } public void executeTask(Task task){ System.out.println("一个新的任务到达:" + task); executor.execute(task); // 提交任务 System.out.println("Server: Pool Size: " + executor.getPoolSize()); System.out.println("Server: Active Count: " + executor.getActiveCount()); System.out.println("Server: Completed Tasks: " + executor.getCompletedTaskCount()); } public void endServer(){ executor.shutdown(); }}
public class TaskServerTest { public static void main(String[] args) { Server server = new Server(); for(int i=0;i<3;i++){ Task task = new Task("task_name_"+i); server.executeTask(task); } server.endServer(); } }
// console结果:创建任务 -> TaskName:task_name_0,initDate:2017-08-23 11:17:45一个新的任务到达:Task [initDate=2017-08-23 11:17:45, name=task_name_0]Server: Pool Size: 1执行任务-> TaskName:task_name_0,date:2017-08-23 11:17:45Server: Active Count: 1Server: Completed Tasks: 0创建任务 -> TaskName:task_name_1,initDate:2017-08-23 11:17:45一个新的任务到达:Task [initDate=2017-08-23 11:17:45, name=task_name_1]Server: Pool Size: 2Server: Active Count: 2Server: Completed Tasks: 0执行任务-> TaskName:task_name_1,date:2017-08-23 11:17:45创建任务 -> TaskName:task_name_2,initDate:2017-08-23 11:17:45一个新的任务到达:Task [initDate=2017-08-23 11:17:45, name=task_name_2]Server: Pool Size: 3Server: Active Count: 3Server: Completed Tasks: 0执行任务-> TaskName:task_name_2,date:2017-08-23 11:17:45完成任务-> TaskName:task_name_1,date:2017-08-23 11:17:47完成任务-> TaskName:task_name_0,date:2017-08-23 11:17:47完成任务-> TaskName:task_name_2,date:2017-08-23 11:17:47