有关于线程与进程的区别请看操作系统之进程管理
文章是《Java编程思想》–Bruce Eckel著,陈昊鹏译的《Thinking in Java》的学习笔记
线程可以驱动任务,如果要在线程上跑任务,那么就需要一种描述任务的方式。这个方式可以有Runnable接口来提供,要想定义一个任务,只需要实现Runnable接口并编写run()方法,使得该任务可以执行你的命令。
package ink.poesy.threadtest;
public class LiftOff implements Runnable{
protected int countDown = 10;
private static int taskCount = 0;
//id用来区分多个线程,final一旦初始化之后就不希望被修改
private final int id = taskCount++;
public LiftOff(){}
public LiftOff(int countDown){
this.countDown = countDown;
}
public String status(){
return "#" + id + "("+
(countDown > 0 ? countDown : "Liftoff!") + "),";
}
@Override
public void run() {
while (countDown-- > 0){
System.out.println(status());
Thread.yield();
}
}
}
Thread.yield();
线程调度器(java线程机制的一部分,可以将CPU从一个线程转移给另一个线程。意义:我已经执行完生命周期中最重要的不分了,此刻正式切换给其他任务执行一段时间的大好时机)。
注:当从Runnable导出一个类时,它必须具有run()方法,但这个方法并无特殊之处——它不会产生任何内在的线程能力。要实现线程行为,必须显示的将一个任务附着到线程上。看下面的2个例子来说明这个问题。
public class MainThread {
public static void main(String[] args) {
LiftOff launch = new LiftOff();
launch.run();
System.out.println("wwl");
}
}
执行10次稳定的显示
上面例子wwl
始终显示在最下面。下面这个例子不是
public class BasicThreads {
public static void main(String[] args) {
Thread t = new Thread(new LiftOff());
t.start();
System.out.println("wwl");
}
}
执行结果
上面例子展示了使用Thread来驱动LiftOff对象。
Thread构造器只需要一个Runnable对象。调用Thread对象的start()方法为该线程执行必须的初始化操作,然后调用Runable的run()方法,以便在这个新线程中启动该任务。尽管start()看起来是产生了一个对长期运行的方法调用,但是从输出中可以看到,start()迅速返回了,因为wwl
消息再倒计时完成之前就出现了。实际上,你产生的是对LiffOff.run()的方法调用,并且这个方法还没有完成,但是因为LiffOff.run()是由不同的线程执行的,因此你仍旧可以执行main()线程中的其他操作。
将Runnable对象转变为工作任务的传统方式是把它提交给一个Thread构造器
下面是添加更多的线程驱动更多的任务。
第一次执行结果
Waiting for LiftOff!
#0(9),#4(9),#3(9),#2(9),#2(8),
#2(7),#2(6),#2(5),#2(4),#2(3),
#2(2),#2(1),#2(Liftoff!),#3(8),
#3(7),#3(6),#3(5),#3(4),#3(3),
#3(2),#3(1),#3(Liftoff!),#1(9),
#1(8),#1(7),#1(6),#1(5),#1(4),
#1(3),#1(2),#1(1),#1(Liftoff!),
#0(8),#0(7),#0(6),#0(5),#0(4),
#0(3),#0(2),#0(1),#0(Liftoff!),#4(8),
#4(7),#4(6),#4(5),#4(4),#4(3),#4(2),
#4(1),#4(Liftoff!),
第二次执行结果
Waiting for LiftOff!
#0(9),#4(9),#0(8),#4(8),#0(7),#4(7),
#0(6),#4(6),#0(5),#4(5),#0(4),#4(4),
#0(3),#4(3),#0(2),#4(2),#0(1),#4(1),
#0(Liftoff!),#4(Liftoff!),#1(9),#1(8),
#1(7),#1(6),#1(5),#1(4),#1(3),#1(2),
#1(1),#1(Liftoff!),#3(9),#3(8),#3(7),
#3(6),#3(5),#3(4),#3(3),#3(2),#3(1),
#3(Liftoff!),#2(9),#2(8),#2(7),#2(6),
#2(5),#2(4),#2(3),#2(2),#2(1),#2(Liftoff!),
输出说明不同任务的执行在线程被换进换出时混在了一起。
以上内容如有争议、指正,留言给我~