java 線程聯合

一、需求

編寫一個Java源程序,其中包含:

  1. 編寫一個實現了Runnable接口的類,這個類中包含3個線程,3個線程的名字是“運貨司機”,“裝運工”,“倉庫管理員”。要求線程“運貨司機”佔有CPU資源之後聯合線程“裝運工”,也就是讓“運貨司機”一直等到“裝運工”完成工作才能開車。線程“裝運工”佔有CPU資源之後聯合線程“倉庫管理員”,也就是讓“裝運工”一直等到“倉庫管理員”打開倉庫才能開始搬運貨物。

  2. 編寫一個包含主方法main的公共類(訪問權限爲public的類),在主方法main中,使用第1步中的編寫的類創建一個對象,使用這個對象調用線程“運貨司機”,“裝運工”和“倉庫管理員”,並啓動線程(start)。


二、知識點

用Runable創建線程:

1、定義一個實現Runable接口的類

2、在此類中重寫Runable接口中的run方法(即:將線程運行的代碼放入run方法中)

3、通過Thread類建立線程對象

4、將Runable接口的子類對象作爲實際參數,傳遞給Thread類構造方法

5、調用Thread類的start方法開啓線程

針對該需求的注意事項:

  • 構造方法中,new Thread的時時候一定要加入this參數

原因:自定run方法所屬的對象是Runable接口的子類對象,所以要讓線程去執行指定對象的run方法,即要將Runable接口的子類對象傳遞給Thread的構造函數。


三、使用類

1、Thread類

  • Thread(Runnable target, String name)
    傳入一個實現了Runable接口的類以及一個字符串,分配新的 Thread 對象。該Thread對象的run方法爲傳入的Runable接口的類的run方法,線程的名字爲傳入的字符串。

  • currentThread()
    <靜態方法> 返回CPU正在執行的線程的對象

  • getName()
    返回該線程的名稱。

  • sleep(long millis)
    <靜態方法> 在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行),此操作受到系統計時器和調度程序精度和準確性的影響。

  • start()
    使該線程開始執行;Java 虛擬機調用該線程的 run 方法。

  • interrupt()
    中斷線程。

  • join()
    等待該線程終止。

2、Runable接口

  • run()
    使用實現接口 Runnable 的對象創建一個線程時,啓動該線程將導致在獨立執行的線程中調用對象的 run 方法。

四、代碼

class 運貨 implements Runnable
{
    Thread 運貨司機,裝運工,倉庫管理員;
    final int 貨物數量 = 10;   
    final int 倉庫門數 = 5;    
    public 運貨()
    {
        運貨司機 = new Thread(this,"運貨司機");
        裝運工 = new Thread(this,"裝運工");
        倉庫管理員 = new Thread(this, "倉庫管理員");
    }
    public void run()
    {   
        if("運貨司機".equals(Thread.currentThread().getName())) 
        {
            System.out.println(Thread.currentThread().getName()+"等待裝運工裝貨");
            try
            {
                裝運工.join();
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"打開車鎖");
            System.out.println(Thread.currentThread().getName()+"把握方向盤");
            System.out.println(Thread.currentThread().getName()+"掛檔");
            System.out.println(Thread.currentThread().getName()+"踩油門");

        }
        if("裝運工".equals(Thread.currentThread().getName())) 
        {
            System.out.println(Thread.currentThread().getName()+"等待倉庫管理員開門");
            try
            {
                倉庫管理員.join();
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            for (int i = 1; i <= 貨物數量; i++)
            {
                System.out.println(Thread.currentThread().getName()+"搬運第"+i+"箱貨物到貨車");
                try
                {
                    Thread.sleep(5000);
                } catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
        if("倉庫管理員".equals(Thread.currentThread().getName())) 
        {
            for (int i = 1; i <= 倉庫門數; i++)
            {
                System.out.println(Thread.currentThread().getName()+"打開第"+i+"道門");
                try
                {
                    Thread.sleep(2000);
                } catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

}
public class Main
{
    public static void main(String[] args)
    {
        運貨 沃爾瑪 = new 運貨();
        沃爾瑪.倉庫管理員.start();
        沃爾瑪.裝運工.start();
        沃爾瑪.運貨司機.start();
    }
}

五、運行截圖

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章