java中线程的两种创建方式与比较

时间:2021-08-05 17:30:41

  首先,回顾一下操作系统课程中进程相关部分:

  进程的定义:进程就是程序在一个数据集合上的一次执行过程。他与程序的区别在于程序是静态的代码,而进程是动态的执行过程。

  进程的特性: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。


A类继承了Thread类,创建对象a后,a调用Thread类的start()函数就开始执行run()方法。

第二种创建方法:

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接口的类的对象本身并不是线程对象,只是作为一个创建线程对象的目标对象使用。