-
定义任务
线程可以驱动任务,你需要一种描述任务的方式。定义任务实现Runnable接口并编写run()方法,使得该任务可以执行你的命令。
package com.zghw.concurrent;
public class LiffOff implements Runnable {
protected int countDown = 10;
private static int taskCount = 0;
private final int id = taskCount++;
public LiffOff(){}
public LiffOff(int countDown){
this.countDown = countDown;
}
public String status(){
return "#id("+id+")"+(countDown>0?countDown:"liffOff!");
}
@Override
public void run() {
while(countDown-->0){
System.out.println(status());
Thread.yield();
}
}
}
任务的run()方法通常总会有某种形式的循环,使得任务一直运行下去直到不再需要。
当从Runnable导出一个类时,它必须具有run()方法,但是这个方法并无特殊之处—它不会产生任何人内在的线程能力。要实现线程行为,你必须显式地将一个任务附着到线程上。
在run()中对静态方法Thread.yield()的调用是对线程调度器的一种建议。它在声明:“我已经执行完生命周期中最重要的部分了,此刻正是切换给其他任务执行一段时间的大好时机。“
2.Thread类
将Runnable对象转变为工作任务的传统方式是把它提交给一个Thread构造器
package com.zghw.concurrent;
public class BasicThread {
public static void main(String args[]){
Thread thread =new Thread(new LiffOff());
thread.start();
System.out.println("Wait for liffOff!");
}
}
Thead构造器只需要一个Runnable对象。调用Thread对象的start()方法为该线程执行必须的初始化操作,然后调用Runnable的run()方法,以便在这个新线程中启动该任务。尽管start()看起来是产生了一个对长期运行方法的调用,但是从输出中可以看到,start()迅速地返回了,因为Waitingfor消息在倒计时完成之前就出现了。程序会同时运行两个方法,main()和LiftOff.run()是程序中与其他线程“同时“执行的代码。
3.更多线程驱动更多任务
package com.zghw.concurrent;
public class MoreBasicThread {
public static void main(String args[]){
for(int i=0;i<5;i++){
Thread thread =new Thread(new LiffOff());
thread.start();
}
System.out.println("Wait for liffOff!");
}
}
输出说明不同任务的执行在线程被换进换出时混在一起。这种交换是有线程调度器自动控制的。如果在你的机器上有多个处理器,线程调度器将会在这些处理器之间默默地分发线程。