21.2.1定义任务
线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供。要想定义任务,只有实现Runnable接口的run方法,使得该任务可以执行你的命令。
如下:
package jiangning.c21;
/**
* Thinking in java c21 例1
* time:2012.10.4
* @author JiangNing
* 显示倒计时的功能
*
*/
public class LiftOff implements Runnable{//实现Runnable接口
protected int countDown = 10;
private static int taskCount = 0;
private final int id = taskCount++;//用了区分任务的多个实例
public LiftOff() {}
public LiftOff(int countDown){
this.countDown = countDown;
}
public String status(){
return "#" + id + "(" +
(countDown > 0 ? countDown : "LiftOff!" )+"),";//如果countDown>0则取countDown否则取LiftOff!
}
public void run(){//重新编写Runnable接口中的run方法
while(countDown-- >0){//设定跳出循环的条件
System.out.print(status());//调用status()方法
Thread.yield();//对线程调度器的一种建议:Java线程机制的一部分,
//可以将CPU从一个线程转移给另一个线程
}
}
}
Thread.yield()静态方法的调用是对线程调度器的一种建议,它在声明:“我已经执行完生命周期中最重要的部分了,此刻正是切换给其它任务执行一段时间的大好时机。”这完全是选择性的,这里更有可能看到任务换进换出的证据。
在main方法中直接调用:
package jiangning.c21;
/**
* Thinking in java c21 例2
* time:2012.10.4
* @author JiangNing
* 创建LiftOff对象,并启动线程
*
*/
public class MainThread {
public static void main(String[] args) {
LiftOff launch = new LiftOff();
launch.run();//调用LiftOff的run方法
System.out.println(Thread.currentThread().getName());//打印当前线程的名称
}
}
/**
* 运行结果
* #0(9),#0(8),#0(7),#0(6),#0(5),#0(4),#0(3),#0(2),#0(1),#0(LiftOff!),main
*/
当从Runnable导出类时,它必须具有run方法,但是这个方法并没有什么特殊之处--它不会产生任何内在的线程能力。要实现线程行为,必须显示将一个任务附着到线程上。
这里用了线程,即总是分配main的那个线程。
总结:本小结主要讲了,实现Runnable接口的run方法,将任务放在run方法内来完成,主要用到while循环的退出条件。