注:参考《Thinking in Java》
多线程是比多进程更低层次的一种多任务概念。而 线程驱动任务(不要理解为线程就是任务,而应该理解成线程驱动任务)
如下:
关于Thread.yield() 方法,可以理解为线程让步。当前线程从执行状态(run()方法中)变为就绪状态,而把自己的CPU执行时间让给其他线程。大概可以理解为:我执行的差不多了(run方法的循环中的一次迭代的操作),这个时候建议线程调度器调度其它线程来执行。也是在建议具有相同优先级的其它线程运行。
即:我现在不那么急,如果有人比较急可以现在先执行,我待会再执行,但是如果没有,我自己接着继续执行。(这时候锁并不会被释放)
public class LiftOff implements Runnable{
protected int countDown = 10;
private static int taskCount = 0;
private final int id = taskCount++;
public LiftOff() {
}
public String status(){
return "#" + id + "(" + (countDown > 0 ? countDown : "Liftoff!") + "). ";
}
public void run() {
// TODO Auto-generated method stub
while(countDown-- > 0){
System.out.println(status());
Thread.yield();
}
}
}
可以直接调用LiftOff实例的run方法,但是这样就不是线程驱动,而是直接调用。注意如果这么干,不会新开启一个线程,而是会直接运行run()的代码。
方法之一是: 可以实现Runnale接口并编写其run()方法,run()方法里面描述要执行的任务。
public class MoreBasicThreads {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=0; i<5; i++)
new Thread(new LiftOff()).start();
System.out.println("Waiting for LiftOff");
}
}
以上用多个线程去驱动了多个任务,从输出结果来看:运行的线程(包括main方法的线程)都是杂乱无章,换进换出时混在一起的。
而且可以观察到start方法很快就返回了:Waiting for LiftOff第一个输出。
Waiting for LiftOff
#1(9).
#0(9).
#2(9).
#4(9).
#1(8).
#0(8).
#4(8).
#1(7).
#4(7).
#2(8).
#3(9).
#2(7).
#1(6).
#0(7).
#1(5).
#0(6).
#2(6).
#3(8).
#4(6).
#3(7).
#2(5).
#0(5).
#1(4).
#3(6).
#4(5).
#2(4).
#1(3).
#0(4).
#1(2).
#0(3).
#2(3).
#4(4).
#3(5).
#4(3).
#2(2).
#0(2).
#1(1).
#0(1).
#2(1).
#4(2).
#3(4).
#1(Liftoff!).
#0(Liftoff!).
#2(Liftoff!).
#4(1).
#3(3).
#3(2).
#4(Liftoff!).
#3(1).
#3(Liftoff!).
当然还有其它方式:
比如:
public class SimpleThread extends Thread{
public void run(){
//some code
}
}
直接继承Thread类,写run()方法。然后start启动SimpleThread即可。