JAVA的线程对象实现的两种方法

1.       概述

线程不仅仅局限于操作系统中,在程序设计语言、数据库管理系统和其他的一些应用软件中,也可以通过引入线程来改善系统和应用程序的性能。

在一个进程中包含多个并行执行的控制流,而不是把多个可并发执行的控制流一一分散在多个进程中,这是并发线程程序设计与并发多进程程序设计的不同之处。并发多线程程序设计的主要优点是使系统性能获得很大的提高,具体表现为快速切换线程、减少系统管理的开销、线程通信易于实现、并发程度高、节省内存空间。

JAVA支持内置的多线程机制。JAVA语言包中的 java.lang.Thread类具有封装线程的能力,它提供了创建、管理和控制线程对象的重要方法。

2.       实现JAVA线程的两种方法

之前的JAVA程序运行时,进程由main()方法开始执行,进程中只有一个线程,这就是main线程,也称为主线程。当在main()方法中创建多个线程对象并启动线程执行对象时,进程中则包含了多个线程并发地执行。

JAVAjava.lang.Thread类用于创建和控制线程。线程对象由Thread类及其子类声明,线程对象的执行方法是java.lang.Runnable接口中的run()方法。就像应用程序必须从main开始执行一样,一个线程必须从run()方法开始执行。

实现线程可有下面两种方法:

1)  继承Thread

举一个例子如下:声明自定义的线程类NumberThread继承Thread类,其中的成员变量k设置为序列初始值,run()方法覆盖了Thread类的run方法,提供线程的执行体,输出一个奇数(偶数)序列。程序如下:

 

public class NumberThread extends Thread

{

    private int k;

    public NumberThread(String name, int k)

    {

       super(name);

       this.k = k;

    }

    public NumberThread(String name)

    {

       this(name,0);

    }

    public void run()

    {

       int i = k;

       System.out.println("/n" + this.getName() +": ");

       while(i < 50)

       {

           System.out.println(i + " ");

           i += 2;

       }

       System.out.println(this.getName() + "结束");

    }

    public static void main(String args[])

    {

       NumberThread threadOdd = new NumberThread("奇数线程",1);

       NumberThread threadEven = new NumberThread("偶数线程",2);

       threadOdd.start();

       threadEven.start();

       System.out.println("activeCount = " +  threadEven.activeCount());

    }

}

2)  实现Runnable接口

本类通过Runnable接口来实现上面例子的功能。程序如下:

 

public class NumberRunnable implements Runnable

{

    private int k;

    public NumberRunnable(int k)

    {

       this.k = k;

    }

    public NumberRunnable()

    {

       this(0);

    }

    @Override

    public void run()

    {

       // TODO Auto-generated method stub

       int i = k;

       while(i < 50)

       {

           System.out.println(i+ " ");

           i += 2;

       }

       System.out.println("结束!");

    }

    public static void main(String args[])

    {

       NumberRunnable odd = new NumberRunnable(1);

       Thread threadOdd = new Thread(odd,"奇数线程");

       NumberRunnable even = new NumberRunnable();

       Thread threadEven = new Thread(even,"偶数线程");

       threadOdd.start();

       threadEven.start();

    }

}

每次运行程序,程序的输出结果都不一样。线程是有CPU来调度执行的,程序不能控制线程运行的先后。

3.       两种方法的比较

直接继承线程Thread类:自定义一个线程类需要声明继承Thread类,并且必须覆盖Thread类的run()方法,直接说明线程对象执行的操作。这种方法适用于单重继承,不适合于多重继承。好处是,Thread类的子类具有Thread类声明的方法,其对象是线程对象可以直接控制和操作。

实现Runnable接口:在需要多重继承的情况下,就只能用实现Runnable 接口方式。一个声明实现Runnable接口的类,本身不是线程对象,同时还需要再声明线程对象,因此,实现Runnable接口的类的对象是作为一个线程对象的目标对象使用的。

 

你可能感兴趣的:(JAVA)