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

11-案例实现

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

案例实现

根据如下步骤来实现本案例。

1.创建 MyThread 类,扩展 Thread 类:

public class MyThread extends Thread {

2.声明3个 Date 类型的私有字段,它们分别为 creationDatestartDate 以及 finishDate

private final Date creationDate;
private Date startDate;
private Date finishDate;

3.实现一个该类的构造方法。它以一个 name 字符串和一个可执行的 Runnable 对象作为参数。初始化该线程的创建日期:

public MyThread(Runnable target, String name ){
  super(target,name);
  creationDate = new Date();
}

4.实现 run() 方法。存储该线程的开始日期,调用父类的 run() 方法,然后存储本次执行的完成日期:

@Override
public void run() {
  setStartDate();
  super.run();
  setFinishDate();
}

5.实现一个刷新 startDate 字段值的方法:

public synchronized void setStartDate() {
  startDate=new Date();
}

6.实现一个刷新 finishDate 字段值的方法:

public synchronized void setFinishDate() {
  finishDate=new Date();
}

7.实现一个 getExecutionTime() 方法,通过计算开始日期与完成日期的时间差来获得线程的执行时间:

public synchronized long getExecutionTime() {
  return finishDate.getTime()-startDate.getTime();
}

8.重写 toString() 方法,返回该线程的创建日期和执行时间:

@Override
public synchronized String toString(){
  StringBuilder buffer=new StringBuilder();
  buffer.append(getName());
  buffer.append(": ");
  buffer.append(" Creation Date: ");
  buffer.append(creationDate);
  buffer.append(" : Running time: ");
  buffer.append(getExecutionTime());
  buffer.append(" Milliseconds.");
  return buffer.toString();
}

9.新建一个 MyThreadFactory 类,实现 ThreadFactory 接口:

public class MyThreadFactory implements ThreadFactory {

10.声明一个 AtomicInteger 类型的 counter 私有字段:

private AtomicInteger counter;

11.声明一个 String 类型的 prefix 私有字段:

private String prefix;

12.实现一个构造方法来初始化该类的字段:

public MyThreadFactory (String prefix) {
  this.prefix=prefix;
  counter=new AtomicInteger(1);
}

13.实现一个 newThread() 方法。创建一个 MyThread 对象,并增加 counter 字段值:

@Override
public Thread newThread(Runnable r) {
  MyThread myThread=new MyThread(r,prefix+"-"+counter
                                          .getAndIncrement());
  return myThread;
}

14.新建一个 MyTask 类,实现 Runnable 接口。实现 run() 方法,使当前线程休眠2s:

public class MyTask implements Runnable {
  @Override
  public void run() {
    try {
      TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

15.实现本案例 Main 类的一个 main() 方法:

public class Main {
  public static void main(String[] args) throws Exception {

16.创建一个 MyThreadFactory 对象:

MyThreadFactory myFactory=new MyThreadFactory
                                       ("MyThreadFactory");

17.创建一个 Task 对象:

MyTask task=new MyTask();

18.用该工厂类的 newThread() 方法创建一个用来执行该任务的 MyThread 对象:

Thread thread=myFactory.newThread(task);

19.启动该线程并等待它的完成:

thread.start();
thread.join();

20.用 toString() 方法来打印该线程的信息:

System.out.printf("Main: Thread information.\n");
System.out.printf("%s\n",thread);
System.out.printf("Main: End of the example.\n");