首先,回顾一下操作系统课程中进程相关部分:
进程的定义:进程就是程序在一个数据集合上的一次执行过程。他与程序的区别在于程序是静态的代码,而进程是动态的执行过程。
进程的特性:1.结构性,进程由程序块、数据块、进程控制块(PCB)组成;
2.动态性,进程是一次动态的执行过程,具有生命周期;
3.独立性,进程是系统分配资源和保护的基本单位;
4. 并发性,一组进程在执行时间上可以重叠,在很短的时间内轮流执行,宏观上同时执行。(并行微观上也是同 时执行)
早期的操作系统中,进程是分配资源和保护的基本单位也是处理器调度的基本单位,后来系统把“独立资源分配”和“被调度分派执行”功能分开,独立资源分配的基本单位仍是进程,“被调度分派执行”的基本单位成了线程。线程就是进程中能够独立执行的实体,是处理器调度和分派的基本单位。
下面讨论java中创建线程的两种方式和之间的区别:
1. Runna接口
声明如下:
public interface Runnable { public abstract void run(); }
这个接口只有一个run()方法,也就是线程的执行方法,一个线程对象必须实现run()方法描述该线程所有的操作。
2.Thread类
Thread类就是线程类,他的部分方法声明如下:
public class Thread extends Object implements Runnable { public Thread(); public Thread(String name); public Thread(Runnable target ); public Thread(String name,Runnable target); public void run(); public void start(); public String toString() }
从Thread类的构造方法可以看出,java创建线程的两种方法是:继承Thread类,实现Runnable接口。
第一种创建方法:
public class A extends Thread { public void run() {
System.out.print(0);
}
public static void main(String []args){ A a=new A("线程1");
a.start(); }}
执行后输出0。
第二种创建方法:
public class A implements Runnable { public void run() { System.out.print(1); } public static void main(String []args) { A a=new A(); Thread t=new Thread(a); t.start(); } }
执行后输出1。
A类实现了Runnable接口,也就是实现了run()函数,将A类对象a作为目标对象,创建一个线程对象t,调用t.start(),将执行a的run()方法。
两种方法的比较:
两种方式创建线程对象的效果是一样的,不同场合如何选取呢?
继承Threa类,并且覆盖Thread类的run()方法:这种方法的优点是Thread子类对象就是线程对象,具有Thread类的方法,且具有线程体,但是不适应多继承。因为java里类的继承是单继承的,继承了Thread类就无法继承其他类了。
实现Runnable接口:如果一个类已经继承了一个类还必须要以线程方式运行,就需要实现Runnable接口。实现Runnable接口的类的对象本身并不是线程对象,只是作为一个创建线程对象的目标对象使用。