当前位置:早雪网网络学院编程文档Java → Java入门笔记6_线程

Java入门笔记6_线程

减小字体 增大字体 作者:未知  来源:从互联网收集整理并转载  发布时间:2005-6-3 0:56:07

1. 多线程

1.1 创建线程类

Java中可以简单的从Thread类中继承创建自己的线程类:

public class MyFirstThread extends Thread {

    public void run() { . . .}

}

说明:

(1) Thread类位是java.lang包中,所以可以不用显示import

(2) Thread类中继承下来的类最好重载run()方法,以运行需要的代码;

可以按以下方法实例化并运行线程:

MyFirstThread aMFT = new MyFirstThread();

aMFT.start();

说明:

(3) 实例化线程类后,系统会初始化一些参数,主要是为线程创建名称,把新的线程加入指定的线程组,初始化线程运行需要的内存空间,指定新线程的优先级别,指定它的守候线程;

(4) start方法是Thread类中的方法,它会调用run方法,在新的线程中运行指定的代码;

(5) 除了start方法外,从Thread继承下来的类还具有其它一些主要的方法:stopsuspendresume等;

以下是一个完整的Thread派生类:

1: public class ComplexThread extends Thread {

 2:     private int delay;

 3:

 4:     ComplexThread(String name, float seconds) {

 5:         super(name);

 6:         delay = (int) seconds * 1000;   // delays are in milliseconds

 7:         start();                        // start up ourself!

 8:     }

 9:

10:     public void run() {

11:         while (true) {

12:             System.out.println(Thread.currentThread().getName());

13:             try {

14:                 Thread.sleep(delay);

15:             } catch (InterruptedException e) {

16:                 return;

17:             }

18:         }

19:     }

20:

21:     public static void main(String argv[]) {

22:         new ComplexThread("one potato",   1.1F);

23:         new ComplexThread("two potato",   1.3F);

24:         new ComplexThread("three potato", 0.5F);

25:         new ComplexThread("four",         0.7F);

26:     }

27: }

1.2 Runable接口

创建多线程运行指定代码的另一种方法是,在创建类时implement Runable这个接口:

public class MySecondThread extends ImportantClass implements Runnable {

    public void run() {. . .}

}

说明:

(1) 该类implement Runable接口,就表明有意图运行在单独的线程中,Thread也是implement Runable接口的;

(2) Implement Runalbe接口至少需要实现run方法;

以下是创建新线程运行该类的实例:

MySecondThread  aMST = new MySecondThread();

Thread       aThread = new Thread(aMST);

aThread.start();

说明:

(3) Thread类有多个构造函数Thread()Thread(Runable target)等,本例中用的就是第二个构造函数,它有一个Runable类型的函数,所以要在多线程中运行的实例的类必须是implement Runable的;

(4) AThead.start()方法调用Thread实例的中的target.run方法,本例中就是MySecondThread实例中的run方法;

(5) Thread构造函数还可以指定线程名,运行所需的stack,线程所属的组等;

为了防止线程非正常结束,需要将start方法置入try…catch中,如:

try{

myThread.start();  

}catch(ThreadDeath aTD){

    System.out.println("end Thread");

    throw aTD;

}

在这个例子中将捕获ThreadDeath异常,处理后重新抛出该异常,以便Java执行stop方法,进行资源等清理工作。

1.3 线程的优先级

多个线程的执行是有一定的优先级别的,对于下面这个例子:

public class RunnablePotato implements Runnable {

    public void run() {

        while (true)

            System.out.println(Thread.currentThread().getName());

    }}

public class PotatoThreadTester {

    public static void main(String argv[]) {

        RunnablePotato aRP = new RunnablePotato();

        Thread T1 = new Thread(aRP, "one potato");

        Thread T2 = new Thread(aRP, "two potato");

        T1.start();

        T2.start();

    }}

对于非抢占式的系统,上例中的第一个线程会一直运行,第二个线程没有机会运行;对于抢占式的系统,这二人线程会交替运行。

为了让多线程在非抢占式中运行,最好在run方法中加入以下语句:

Thread.yield()

 

public void run() {

        while (true)

            System.out.println(Thread.currentThread().getName());

            Thread.yield()

    }

Thread.yield会将当前线程暂时让位一小段时间,让其它的线程有机会运行,过了这段时间后,该线程继承运行。上述功能也可以用Thread.sleep()方法

[数据载入中...] [返回上一页] [打 印]