Java 多線程(二) 線程的實現


Java 多線程(二) 線程的實現

 

線程的實現

  在Java中通過run方法為線程指明要完成的任務,有兩種技術來為線程提供run方法:

  1.繼承Thread類並重寫它的run方法。之后創建這個子類的對象並調用start()方法。

  2.通過定義實現Runnable接口的類進而實現run方法。這個類的對象在創建Thread的時候作為參數被傳入,然后調用start()方法。

 

  Thread類是專門用來創建線程和對線程進行操作的類。當某個類繼承了Thread類之后,該類就叫做一個線程類

  兩種方法均需執行線程的start()方法為線程分配必須的系統資源、調度線程運行並執行線程的run()方法。

  start()方法是啟動線程的唯一的方法。start()方法首先為線程的執行准備好系統資源,然后再去調用run()方法。一個線程只能啟動一次,再次啟動就不合法了。

  run()方法中放入了線程的工作,即我們要這個線程去做的所有事情。缺省狀況下run()方法什么也不做。

  在具體應用中,采用哪種方法來構造線程要視情況而定。通常,當一個線程已經繼承了另一個類時,就應該用第二種方法來構造,即實現Runnable接口。

  下面給出兩個例子來說明線程的兩種實現方法,每個例子中都有兩個線程:

線程實現方法1
public class ThreadTest1
{
    public static void main(String[] args)
    {
        Thread1 thread1 = new Thread1();
        Thread2 thread2 = new Thread2();

        thread1.start();
        thread2.start();
    }

}

class Thread1 extends Thread
{
    @Override
    public void run()
    {
        for (int i = 0; i < 100; ++i)
        {
            System.out.println("Hello World: " + i);
        }
    }
}

class Thread2 extends Thread
{
    @Override
    public void run()
    {

        for (int i = 0; i < 100; ++i)
        {
            System.out.println("Welcome: " + i);
        }
    }
}

 

線程實現方法2
public class ThreadTest2
{
    public static void main(String[] args)
    {
        // 線程的另一種實現方法,也可以使用匿名的內部類
        Thread thread1 = new Thread(new MyThread1());
        thread1.start();

        Thread thread2 = new Thread(new MyThread2());
        thread2.start();

    }

}

class MyThread1 implements Runnable
{

    @Override
    public void run()
    {
        for (int i = 0; i < 100; ++i)
        {
            System.out.println("Hello: " + i);
        }

    }

}

class MyThread2 implements Runnable
{

    @Override
    public void run()
    {
        for (int i = 0; i < 100; ++i)
        {
            System.out.println("Welcome: " + i);
        }

    }
}

 

Thread類剖析

  Thread類也實現了Runnable接口,因此實現了接口中的run()方法。

  當生成一個線程對象時,如果沒有為其指定名字,那么線程對象的名字將使用如下形式:Thread-number,該number是自動增加的數字,並被所有的Thread對象所共享,因為它是一個static的成員變量。

  當使用第一種方式(繼承Thread的方式)來生成線程對象時,我們需要重寫run()方法,因為Thread類的run()方法此時什么事情也不做。

  當使用第二種方式(實現Runnable接口的方式)來生成線程對象時,我們需要實現Runnable接口的run()方法,然后使用new Thread(new MyRunnableClass())來生成線程對象(MyRunnableClass已經實現了Runnable接口),這時的線程對象的run()方法會調用MyRunnableClass的run()方法。

 

停止線程

  線程的消亡不能通過調用stop()命令,而是讓run()方法自然結束。stop()方法是不安全的,已經廢棄。

  停止線程推薦的方式:設定一個標志變量,在run()方法中是一個循環,由該標志變量控制循環是繼續執行還是跳出;循環跳出,則線程結束。

  如代碼例子中所示:

控制線程代碼示例
public class ControlThreadTest
{
    MyThreadClass r = new MyThreadClass();

    Thread t = new Thread(r);

    public void startThread()
    {
        t.start();
    }

    public void stopThread()
    {

        r.stopRunning();

    }

}

class MyThreadClass implements Runnable
{
    private boolean flag = true;

    @Override
    public void run()
    {
        while (flag)
        {
            System.out.println("Do something.");
        }
    }

    public void stopRunning()
    {
        flag = false;
    }

}

 


參考資料

  聖思園張龍老師Java SE系列視頻教程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM