11-案例实现
案例实现
按照如下步骤来实现本案例。
1.创建 Task
类,该类实现了 Runnable
接口:
public class Task implements Runnable {
2.在类中添加 long
型的私有属性 milliseconds
:
private final long milliseconds;
3.实现该类的构造函数以初始化其属性:
public Task (long milliseconds) {
this.milliseconds=milliseconds;
}
4.实现接口中的 run()
方法,使线程休眠由 milliseconds
属性指定的毫秒数:
@Override
public void run() {
System.out.printf("%s: Begin\n",
Thread.currentThread().getName());
try {
TimeUnit.MILLISECONDS.sleep(milliseconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("%s: End\n",
Thread.currentThread().getName());
}
5.实现本案例的主类,新建 Main
类和 main()
方法:
public class Main {
public static void main(String[] args) throws Exception {
6.通过 Executors
类中的 newCachedThreadPool()
方法创建一个新的 Executor
对象:
ThreadPoolExecutor executor = (ThreadPoolExecutor)
Executors.newCachedThreadPool();
7.依次递交10个 Task
对象到执行器中,用一个随机数初始化这些对象:
Random random=new Random();
for (int i=0; i<10; i++) {
Task task=new Task(random.nextInt(10000));
executor.submit(task);
}
8.调用 showLog()
方法获得与执行器相关的信息,并休眠1s。以上步骤循环5次:
for (int i=0; i<5; i++){
showLog(executor);
TimeUnit.SECONDS.sleep(1);
}
9.用 shutdown()
方法关闭执行器:
executor.shutdown();
10.继续通过 showLog()
方法获知与执行器相关的信息并休眠1s。以上步骤循环5次:
for (int i=0; i<5; i++){
showLog(executor);
TimeUnit.SECONDS.sleep(1);
}
11.通过 awaitTermination()
方法等待执行器执行结束:
executor.awaitTermination(1, TimeUnit.DAYS);
12.在控制台中显示程序结束的信息:
System.out.printf("Main: End of the program.\n");
}
13.实现 showLog()
方法。该方法接收 Executor
作为参数,并输出线程池的大小、当前任务的数量以及执行器的状态:
private static void showLog(ThreadPoolExecutor executor) {
System.out.printf("*********************");
System.out.printf("Main: Executor Log");
System.out.printf("Main: Executor: Core Pool Size: %d\n",
executor.getCorePoolSize());
System.out.printf("Main: Executor: Pool Size: %d\n",
executor.getPoolSize());
System.out.printf("Main: Executor: Active Count: %d\n",
executor.getActiveCount());
System.out.printf("Main: Executor: Task Count: %d\n",
executor.getTaskCount());
System.out.printf("Main: Executor: Completed Task Count: %d\n",
executor.getCompletedTaskCount());
System.out.printf("Main: Executor: Shutdown: %s\n",
executor.isShutdown());
System.out.printf("Main: Executor: Terminating: %s\n",
executor.isTerminating());
System.out.printf("Main: Executor: Terminated: %s\n",
executor.isTerminated());
System.out.printf("*********************\n");
}