一、需求
編寫一個Java源程序,其中包含:
編寫一個實現了Runnable接口的類,這個類中包含3個線程,3個線程的名字是“運貨司機”,“裝運工”,“倉庫管理員”。要求線程“運貨司機”佔有CPU資源之後聯合線程“裝運工”,也就是讓“運貨司機”一直等到“裝運工”完成工作才能開車。線程“裝運工”佔有CPU資源之後聯合線程“倉庫管理員”,也就是讓“裝運工”一直等到“倉庫管理員”打開倉庫才能開始搬運貨物。
編寫一個包含主方法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();
}
}