一、需求
編寫一個Java源程序,其中包含:
編寫一個實現了Runnable接口的類,這個類中包含3個線程,3個線程的名字是“張工”,“王工”和“老闆”。線程“張工”和線程“王工”分別負責“搬運蘋果”(3箱)和“搬運香蕉”(3箱),他們每搬運一箱,就準備休息10秒鐘(sleep方法),但是線程“老闆”負責不讓他們休息(interrupt方法)。
編寫一個包含主方法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()
中斷線程。
2、Runable接口
- run()
使用實現接口 Runnable 的對象創建一個線程時,啓動該線程將導致在獨立執行的線程中調用對象的 run 方法。
四、代碼
class 搞事情 implements Runnable //實現一個Runnable接口的類
{
Thread 張工,王工,老闆;//這個類中包含3個線程
public 搞事情()
{
張工 = new Thread(this,"張工");
王工 = new Thread(this,"王工");
老闆 = new Thread(this,"老闆");
}
public void run()
{
if("張工".equals(Thread.currentThread().getName())) //防止空指針,故用“張工”這個字符串的equals方法
{
for(int i=1;i<=3;i++) //搬完3箱就ok
{
System.out.println(Thread.currentThread().getName()+"已搬運了"+i+"箱蘋果");
try
{
Thread.sleep(10000);//每搬運一箱,就準備休息10秒鐘(sleep方法)
} catch (InterruptedException e)
{
if(i!=3)
{
System.out.println("老闆讓張工繼續工作");
}
}
}
return;
}
if("王工".equals(Thread.currentThread().getName()))
{
for(int i=1;i<=3;i++) //搬完3箱就ok
{
System.out.println(Thread.currentThread().getName()+"已搬運了"+i+"箱香蕉");
try
{
Thread.sleep(10000);//每搬運一箱,就準備休息10秒鐘(sleep方法)
} catch (InterruptedException e)
{
if(i!=3)
{
System.out.println("老闆讓王工繼續工作");
}
}
}
return;
}
if("老闆".equals(Thread.currentThread().getName()))
{
while(true)
{
if(張工.isAlive()||王工.isAlive())
{
張工.interrupt();
王工.interrupt();
}
else break;
}
System.out.println("老闆說:可以下班了");
}
}
}
public class Main
{
public static void main(String[] args)
{
搞事情 幹活兒 = new 搞事情(); //使用第1步中編寫的類創建一個對象
//使用這個對象調用線程“張工”,“王工”和“老闆”,並啓動線程start
幹活兒.張工.start();
幹活兒.王工.start();
幹活兒.老闆.start();
}
}