java 吵醒休眠的線程

一、需求

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

  1. 編寫一個實現了Runnable接口的類,這個類中包含3個線程,3個線程的名字是“張工”,“王工”和“老闆”。線程“張工”和線程“王工”分別負責“搬運蘋果”(3箱)和“搬運香蕉”(3箱),他們每搬運一箱,就準備休息10秒鐘(sleep方法),但是線程“老闆”負責不讓他們休息(interrupt方法)。

  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()
    中斷線程。

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();
    }
}

五、截圖

這裏寫圖片描述

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