当前位置:嗨网首页>书籍在线阅读

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");
}