线程任务代码:
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:45
Server: Active Count: 1
Server: 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: 2
Server: Active Count: 2
Server: 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: 3
Server: Active Count: 3
Server: 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