11-案例实现
案例实现
根据如下步骤来实现本案例。
1.创建 MyThread 类,扩展 Thread 类:
public class MyThread extends Thread {
2.声明3个 Date 类型的私有字段,它们分别为 creationDate 、 startDate 以及 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");