线程在java的API层面的体现:线程对象本身、线程需要执行的任务(指令流的集合或者栈帧)
1.线程对象本身:java是面向对象的高级语言,即使对象不是能看见或者能摸着的物体,而是一种抽象的概念或者过程,都能用java的OOP思想将其封装为一个对象,线程正是这样一种抽象的存在。
2.线程需要执行的任务:学过设计模式的都知道,java对组合复用的推崇是超过通过继承的。所以将线程需要执行的任务也抽取出来,用Runnable表示线程的任务,也看作一种对象。这样设计的好处就是将线程对象本身 和 它需要执行的任务分离开来,达到更灵活的复用目的。比如很多个线程对象 都可以 并发地执行同意一个任务对象(多个Thread对象+单个Runnable的实现类的实例 ,亦或者多个Thread对象+单个Callable接口的实现类的实例)。但是如果直接new一个Thread对象并重写其任务方法run,这时线程对象和线程任务对象的联系就要比前两种要紧密得多。这时启动线程的方法就多了啊!!!! 请看下面代码…
package threadpart;
public class TaskInThread {
public static void main(String[] args) {
Thread task = new Thread("t0") {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" task in thread itself!!");
}
};
task.start();//直接启动线程
new Thread(task, "t1").start();//只把task当作线程任务,创建一个新线程对象来启动线程
}
}
执行结果:
t0 task in thread itself!! t1 task in thread itself!! 或者: t1 task in thread itself!! t0 task in thread itself!!
你会发现,这样创建线程和任务,task对象的启动方式就不唯一了。但如果不希望使用task.start()这种启动方式,又何必将任务放在一个线程对象内部呢???这不是使任务在主观和客观上都显得很累赘吗?



