最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java線(xiàn)程創(chuàng)建(賣(mài)票),線(xiàn)程同步(賣(mài)包子)的實(shí)現(xiàn)示例

 更新時(shí)間:2021年05月06日 09:29:28   作者:碼農(nóng)編程錄  
這篇文章主要介紹了Java線(xiàn)程創(chuàng)建(賣(mài)票),線(xiàn)程同步(賣(mài)包子)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1.線(xiàn)程兩種創(chuàng)建方式:new Thread(new Runnable() {})

在這里插入圖片描述

如下FileOutputStream源碼中拋出異常,為了讓寫(xiě)代碼人自己寫(xiě)try catch異常提示信息。

在這里插入圖片描述

package com.itheim07.thread;
/*
*   進(jìn)程和線(xiàn)程
*       1. 進(jìn)程 :  航空母艦(資源: 燃油 彈藥)
*       2. 線(xiàn)程 :  艦載機(jī)
*     一個(gè)軟件運(yùn)行: 一個(gè)軍事活動(dòng), 必須有一艘航母出去,但執(zhí)行具體任務(wù)的是航母上的艦載機(jī)
*     一個(gè)軟件運(yùn)行,至少一個(gè)進(jìn)程, 一個(gè)進(jìn)程中至少一個(gè)線(xiàn)程。谷歌瀏覽器是多進(jìn)程,進(jìn)程多了,占用資源多,速度快
*	
*   cpu: 4核 8線(xiàn)程。線(xiàn)程要運(yùn)行,需要cpu授予執(zhí)行權(quán)(指揮室),指揮室可以同時(shí)調(diào)度8架 飛機(jī)
*       1. 并行 : 同一時(shí)間,同時(shí)執(zhí)行 (并行只能8線(xiàn)程)
*       2. 并發(fā) : 同一段時(shí)間, 實(shí)際上是交替執(zhí)行, 速度快的時(shí)候看起來(lái)像是同時(shí)執(zhí)行(頻率快)(常見(jiàn): 并發(fā)1800線(xiàn)程)
*
*   cpu調(diào)度算法(并發(fā))
*       1. 分時(shí)調(diào)度 : 1800s, 每個(gè)線(xiàn)程1s
*       2. 搶占式調(diào)度 : 按照線(xiàn)程優(yōu)先級(jí)進(jìn)行分配, 優(yōu)先級(jí)高(可以自己設(shè)置)一般就分配的多(隨機(jī)性強(qiáng)) java
*
*   為什么需要多線(xiàn)程?
*       1. 默認(rèn)java代碼有兩個(gè)線(xiàn)程
*           1. main方法線(xiàn)程 : 主線(xiàn)程
*           2. GC線(xiàn)程(jvm使用的,我們無(wú)法調(diào)度)
*       2. 一個(gè)線(xiàn)程可用, 有什么局限性?只能做一件事
*       3. 如果想要同時(shí)執(zhí)行多個(gè)任務(wù) -> 多線(xiàn)程
*/
public class ThreadDemo {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    System.out.println("播放音樂(lè)...");
                }
            }
        }).start();  //.start()不能改成.run()

        boolean result = true;
        while(result){ 
            System.out.println("下載電影...");
        }
       /* while(result){ //雖然騙了編譯器,但還是不能執(zhí)行到這里
            System.out.println("播放音樂(lè)...");
        }*/
    }
}

如下線(xiàn)程第一種創(chuàng)建方式。

在這里插入圖片描述

package com.itheima01.thread;
/*
    Thread:1. start() : 啟動(dòng)線(xiàn)程,jvm會(huì)創(chuàng)建線(xiàn)程,并調(diào)用run方法
            2. static Thread currentThread(),返回對(duì)當(dāng)前正在執(zhí)行的線(xiàn)程對(duì)象的引用。
            3. String getName() : 獲取線(xiàn)程名稱(chēng)
     !!! Thread.currentThread().getName() : 獲取當(dāng)前線(xiàn)程名稱(chēng)

      線(xiàn)程默認(rèn)命名規(guī)則:1. main線(xiàn)程 :  main
         2. 子線(xiàn)程(main線(xiàn)程創(chuàng)建的線(xiàn)程) : static int number;static被共享
            Thread-0 , 1, 2 ...
*/
public class ThreadDemo02 {
    public static void main(String[] args) {
//        Thread thread = Thread.currentThread();
//        String name = thread.getName(); 
//        System.out.println(name); // main
        //下面一行等同于上面
        System.out.println("主:" + Thread.currentThread().getName());

        YourThread yt = new YourThread();
        yt.start(); //子:Thread-0        
        YourThread yt2 = new YourThread();
		yt.run(); //子:main。  因?yàn)樽泳€(xiàn)程YourThread還未執(zhí)行起飛	,被main飛機(jī)拖著走	
        YourThread yt3 = new YourThread();
        yt3.start(); //子:Thread-2。  不是Thread-1是因?yàn)閥t2未起飛但依舊new了yt2

//        Person p = new Person(); //執(zhí)行空參構(gòu)造
//        System.out.println(p.number); //0 
//        Person p2 = new Person();
//        System.out.println(p2.number); //1
    }
}
class YourThread extends Thread{
    @Override
    public void run() {
        System.out.println("子:" + Thread.currentThread().getName());
    }
}
class Person{
    static int number=-1;
    public Person(){
        number++;
    }
}
package com.itheima02.runnable;
/*
* 線(xiàn)程第二種創(chuàng)建方式: 1. 聲明實(shí)現(xiàn) Runnable 接口的類(lèi)。
*      				  2. 該類(lèi)然后實(shí)現(xiàn) run 方法。
*       			  3. 然后可以分配該類(lèi)的實(shí)例,在創(chuàng)建 Thread 時(shí)作為一個(gè)參數(shù)來(lái)傳遞并啟動(dòng)。
*      					Thread(Runnable target)
*/
public class RunnableDemo {
    public static void main(String[] args) {
        MyRunnable mr = new MyRunnable(); // 分配該類(lèi)的實(shí)例
        Thread t = new Thread(mr);
        t.start();  //Thread-0
    }
}
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}
package com.itheima02.runnable;
//用匿名內(nèi)部類(lèi)簡(jiǎn)化上面代碼
public class RunnableDemo02 {
    public static void main(String[] args) {		
     /* Runnable mr = new Runnable(){ //用接口名Runnable代替子類(lèi)類(lèi)名,匿名對(duì)象。     
  //不用再寫(xiě)class MyRunnable implements Runnable{},Runnable mr = new MyRunable(); 向上轉(zhuǎn)型     
            @Override    
            public void run() {  //new一個(gè)接口()再{},是new這個(gè)接口的子類(lèi)對(duì)象
                System.out.println(Thread.currentThread().getName());
            }
        };
        
        Thread t = new Thread(mr);
        t.start();
	   // new Thread(mr).start(); */

//111111111111111111111111111111111111111111111111111111111111111111111111111111
       new Thread(new Runnable() {
           @Override
           public void run() { //主要關(guān)注run
               System.out.println(Thread.currentThread().getName());
           }
       }).start();
	   
//new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
    }
}

2.賣(mài)票:原子性

package com.itheima03.ticket;
/*
*  需求假設(shè)某航空公司有三個(gè)窗口發(fā)售某日某次航班的100張票,100張票可以作為共享資源,三個(gè)售票窗口需要?jiǎng)?chuàng)建三個(gè)線(xiàn)程
*  	    好處: 多線(xiàn)程執(zhí)行同一任務(wù),比較快
*  	        1. 程序(單線(xiàn)程) , 并發(fā)1600線(xiàn)程, cpu分配執(zhí)行權(quán): 1/1600
*  	        2. 程序(多線(xiàn)程 100)  , 并發(fā)1700, cpu分配給我們的程序執(zhí)行權(quán)更多:1/17
*  	    注意: 線(xiàn)程不是越多越好(線(xiàn)程本身很占內(nèi)存, 慢。票數(shù)不多不需要用多線(xiàn)程)
*/
public class TicketDemo01 {
    public static void main(String[] args) {
        MyWindow mw1 = new MyWindow(); //堆中開(kāi)一塊空間,不加static,number=100進(jìn)堆
        mw1.setName("窗口壹");

        MyWindow mw2 = new MyWindow(); //同上
        mw2.setName("窗口222");

        MyWindow mw3 = new MyWindow(); //同上
        mw3.setName("窗口三三三");        
        mw1.start();
        mw2.start();
        mw3.start();
    }
}

//11111111111111111111111111111111111111111111111111111111111111111111111111111
class MyWindow extends Thread{
    static int number = 100; //去掉static,每創(chuàng)建一個(gè)MyWindow窗口在堆里開(kāi)辟一塊空間,三個(gè)窗口各賣(mài)100張
    @Override
    public void run() {
       while(number > 0){
           System.out.println(Thread.currentThread().getName() + "正在賣(mài)出第" + number + "張票");
           number--;
       }
    }
}
/*
*   兩種線(xiàn)程創(chuàng)建方式: 1. 繼承Thread
*       			  2. 實(shí)現(xiàn)Runnbale
*   如上第二種方案會(huì)更好一些,不需要加static,因?yàn)橹籲ew了一個(gè)對(duì)象
*       1. 實(shí)現(xiàn)接口,而不是繼承類(lèi)(擴(kuò)展性更強(qiáng)) 接口可以多實(shí)現(xiàn),但是類(lèi)只能單繼承(MyWindow繼承Thread后,就不能繼承另外的類(lèi)。MyTask可以繼承其他類(lèi),實(shí)現(xiàn)其他接口)
*       2. 更符合 面向?qū)ο?(高內(nèi)聚,低耦合:線(xiàn)程獨(dú)立,和業(yè)務(wù)代碼MyTask分離,傳入賣(mài)豬肉任務(wù)也行)。封裝(各干各的,有必要再進(jìn)行合作)
*/

如下線(xiàn)程同步問(wèn)題分析:兩種創(chuàng)建方式3個(gè)窗口都總賣(mài)出102張票,而不是100張。原因:三個(gè)窗口同時(shí)卡在打印正在賣(mài)出第100張票。解決:t1在賣(mài)第100張票時(shí),cpu可能會(huì)切到t3和t2,可以控制t2和t3不動(dòng),等t1的number- -完再動(dòng)。

在這里插入圖片描述

3.線(xiàn)程同步:synchronized關(guān)鍵字,Lock接口,ThreadLocal

package com.itheima04.synchronizedd;
import java.io.IOException;
/*
*       1. 代碼塊
*           synchronized(鎖對(duì)象){
*               代碼A
*           }
*           1. 鎖對(duì)象可以是任意對(duì)象,但必須唯一
*           2. 同步代碼塊中的 代碼A 同一時(shí)間,只允許一個(gè)線(xiàn)程執(zhí)行
* 使用同步鎖的注意點(diǎn):1. 在保證業(yè)務(wù)邏輯可用的情況,同步鎖加的范圍越小越好
* 
*  2. 鎖對(duì)象必須唯一:<1> 如果能保證當(dāng)前對(duì)象唯一,this也可以作為鎖對(duì)象 (更節(jié)省內(nèi)存)
*  <2> 當(dāng)前類(lèi)名.class(最好的鎖對(duì)象) -> Class對(duì)象(一個(gè)類(lèi)被加載,在內(nèi)存都會(huì)有一個(gè)Class對(duì)象) 反射
*/
public class TicketDemo02 {
    public static void main(String[] args) {
        MyTask mt = new MyTask();        
        //上面只new了一個(gè),可以用this
        Thread t1 = new Thread(mt);
        t1.setName("窗口壹");
        
        Thread t2 = new Thread(mt);
        t2.setName("窗口222");
        
        Thread t3 = new Thread(mt);
        t3.setName("窗口三三三");           
        t1.start();
        t2.start();
        t3.start();
    }
}

class MyTask implements Runnable{ 
    int number = 100;
//   Object obj = new Object();  //鎖對(duì)象
    @Override
    public void run() {
        while(number > 0){

//1111111111111111111111111111111111111111111111111111111111111111111111111111111111111        
            synchronized(MyTask.class){ //MyTask.class也可以換成this
                if(number <= 0){
                    break;  //跳出while大循環(huán)
                }
                System.out.println(Thread.currentThread().getName() + "正在賣(mài)出第" + number + "張票");
                number--;
            }  

//111111111111111111111111111111111111111111111111111111111111111111111111111111111111             
//這邊只能try catch不能throws,原因:父類(lèi)Runnable中run方法沒(méi)有聲明拋出編譯異常,所以子類(lèi)也不能throws        
            try {
                Thread.sleep(1); //線(xiàn)程啥事也不干,暫停1ms,cpu有空閑切換其他線(xiàn)程
            } catch (InterruptedException e) { 
                e.printStackTrace();
            }
        } //while里
    }
}

在這里插入圖片描述

如下t2賣(mài)到0張時(shí)出while,而t1和t3還在while里,此時(shí)number=0,所以變?yōu)?和-1。

在這里插入圖片描述

如下把synchronized拖到外面也不行。

在這里插入圖片描述

如下加if(number <= 0),沒(méi)有加浪費(fèi)時(shí)間代碼,所以看不到交替效果,但不會(huì)出現(xiàn)0和-1。

在這里插入圖片描述

obj是鎖對(duì)象即鑰匙,如下鑰匙不能進(jìn)run方法(每個(gè)線(xiàn)程一把即三把鑰匙了),只能在成員位置。

在這里插入圖片描述

用this,不用new object(),可以節(jié)約內(nèi)存。

在這里插入圖片描述

package com.itheima05.method;
/*
*   synchronized 方法(同步方法)
*         1. 語(yǔ)法 :  方法聲明 + synchronized
*         2. 同步方法有沒(méi)有鎖對(duì)象? 有
*               1. 普通方法: 是this
*               2. 靜態(tài)方法: 靜態(tài)不能和對(duì)象(this)有關(guān)。 是當(dāng)前類(lèi)名.class
*/
public class TicketDemo02 {
    public static void main(String[] args) {
        MyTask mt = new MyTask();        
        Thread t1 = new Thread(mt);
        t1.setName("窗口壹");
        
        Thread t2 = new Thread(mt);
        t2.setName("窗口222");
        
        Thread t3 = new Thread(mt);
        t3.setName("窗口三三三");        
        t1.start();
        t2.start();
        t3.start();
    }
}

class MyTask implements Runnable{
    static int number = 100;
    @Override
    public void run() { 
        while(number > 0){
            method(); //非靜態(tài)方法可以調(diào)用靜態(tài)方法       
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
       
    private static synchronized void method() { //靜態(tài)方法不能和對(duì)象關(guān)鍵字如this相關(guān)  //同步方法效果  等價(jià)于 同步代碼塊
        if(number <= 0){
            return;  //break只能寫(xiě)在循環(huán)和switch里
        }
        System.out.println(Thread.currentThread().getName() + "正在賣(mài)出第" + number + "張票");
        number--;
    }
}
package com.itheima06.lock;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/*
*   Lock接口: 1. 實(shí)現(xiàn)類(lèi) ReentrantLock
*             2. lock() 獲取鎖(獲取鑰匙)
*             3. unlock() 釋放鎖 (還鑰匙)
*/
public class TicketDemo02 {
    public static void main(String[] args) {
        MyTask mt = new MyTask();
        Thread t1 = new Thread(mt);
        t1.setName("窗口壹");
        
        Thread t2 = new Thread(mt);
        t2.setName("窗口222");
        
        Thread t3 = new Thread(mt);   
        t3.setName("窗口三三三"); 
        t1.start();
        t2.start();
        t3.start();
    }
}

class MyTask implements Runnable{
    int number = 100;
    Lock lock = new ReentrantLock(); //創(chuàng)建lock對(duì)象
    @Override
    public void run() {
        while(number > 0){

//1111111111111111111111111111111111111111111111111111111111111111111111111
            lock.lock();
            if(number <= 0){
//                System.out.println(Thread.currentThread().getName());
                lock.unlock(); // 注意: lock提供了鎖的可視化操作(線(xiàn)程執(zhí)行結(jié)束,要記得手動(dòng)釋放。廁所上完不能帶走鑰匙)//同步代碼塊return或break后是jvm自動(dòng)釋放鎖。//這里不加lock.unlock()程序停不下來(lái)。
                break;
            }
            System.out.println(Thread.currentThread().getName() + "正在賣(mài)出第" + number + "張票");
            number--;
            lock.unlock();
        }
    }
}

如下ThreadLocal相當(dāng)于一個(gè)map,key就是當(dāng)前的線(xiàn)程,value就是需要存儲(chǔ)的對(duì)象。

在這里插入圖片描述

t1(…,User),如下情況可將User放入ThreadLocal中,每次通過(guò).get拿到線(xiàn)程的User。

在這里插入圖片描述

在這里插入圖片描述

4.賣(mài)包子:wait,notify

package com.itheima07.bz;

public class Demo {
    public static void main(String[] args) throws InterruptedException {
        Object obj = new Object();       
// obj.wait(); //IllegalMonitorStateException : 非法的監(jiān)視狀態(tài)異常,因?yàn)?wait()必須鎖對(duì)象調(diào)用如下
        synchronized (obj){  //對(duì)象變成鎖對(duì)象
            obj.wait(); //不會(huì)報(bào)錯(cuò),一直等待。在鎖對(duì)象中
        }
    }
}

如下兩個(gè)方法wait和notify不是給線(xiàn)程調(diào)用的,而是給鎖對(duì)象【鎖對(duì)象可以是任意對(duì)象】調(diào)用的如上所示。BaoZi只能一個(gè)線(xiàn)程對(duì)其操作。

在這里插入圖片描述

package com.itheima07.bz;

public class BaoZi {
    boolean isHave=false; //默認(rèn)沒(méi)有包子
}
package com.itheima07.bz;

public class BaoziPu extends Thread {
    BaoZi bz;
    public BaoziPu(BaoZi bz){
        this.bz = bz;
    }
    @Override
    public void run() {       
        while(true){ //不停生產(chǎn)包子 

//111111111111111111111111111111111111111111111111111111111111111111111111111111           
            synchronized (bz){ //加鎖: 同步代碼,生產(chǎn)包子時(shí)不讓別人打擾我。注意下面wait和notify
                if(bz.isHave){
                    try {
                        bz.wait(); //包子鋪有包子就等待(此時(shí)吃貨正在吃包子)
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("包子鋪生產(chǎn)包子..."); //沒(méi)包子
                bz.isHave = true;
                bz.notify(); //喚醒吃貨
            }
        }  //while里
    }
}
package com.itheima07.bz;

public class ChiHuo  extends Thread{
    BaoZi bz;
    public ChiHuo(BaoZi bz){
        this.bz = bz;
    }
    @Override
    public void run() {
        while(true){ //不停吃包子

//1111111111111111111111111111111111111111111111111111111111111111111111111111               
            synchronized (bz){
                if(!bz.isHave){
                    try {
                        bz.wait(); //吃貨沒(méi)有包子就等待(此時(shí)包子鋪正在生產(chǎn)包子)
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("吃貨吃包子"); //有包子
                bz.isHave = false;       
                bz.notify(); //喚醒包子鋪
            }
        }
    }
}
package com.itheima07.bz;

public class BzDemo {
    public static void main(String[] args) {
        BaoZi bz = new BaoZi();
        BaoziPu bzp = new BaoziPu(bz); //和下面一行共同操作一個(gè)包子對(duì)象
        ChiHuo ch = new ChiHuo(bz);        
        bzp.start();
        ch.start();
    }
}

在這里插入圖片描述

如下第一次沒(méi)有包子,所以繞過(guò)2中if到1。運(yùn)行完1后就有包子了,1時(shí)間很短,cpu不切換線(xiàn)程,切換了也沒(méi)用,因?yàn)?中syn…(bz)包子被鎖住,就算切換到吃貨線(xiàn)程進(jìn)不去syn…(bz)里,所以1中notify喚不醒吃貨線(xiàn)程。

1和2都在sy…(bz)里,bzp線(xiàn)程bz.wait()【有3個(gè)好處】進(jìn)入等待狀態(tài)即進(jìn)入監(jiān)視隊(duì)列即等待包子被吃,吃貨線(xiàn)程的synchronized鎖被打開(kāi),有包子不會(huì)wait,執(zhí)行3。

一個(gè)線(xiàn)程wait把自己停下來(lái)放入堆(監(jiān)視隊(duì)列)中,來(lái)年開(kāi)春,另一個(gè)線(xiàn)程中3叫我起來(lái)干活。2和3對(duì)應(yīng),1和4對(duì)應(yīng)。3喚醒了2中wait,但2沒(méi)鑰匙(鎖)動(dòng)不了(鬼壓床),鑰匙在吃貨手上,所以3往后4執(zhí)行釋放鎖,1234不停循環(huán)執(zhí)行。

在這里插入圖片描述

生產(chǎn)消費(fèi)者模型:用戶(hù)發(fā)請(qǐng)求來(lái)相當(dāng)于包子鋪生產(chǎn)包子即生產(chǎn)者。服務(wù)器24小時(shí)開(kāi)著相當(dāng)于消費(fèi)者一天24小時(shí)等包子吃。不會(huì)讓消費(fèi)者線(xiàn)程空轉(zhuǎn)浪費(fèi)cpu資源,所以沒(méi)包子設(shè)置消費(fèi)者線(xiàn)程為wait狀態(tài)不占用cpu資源。

package com.atguigu.test14;
// 線(xiàn)程通信是用來(lái)解決生產(chǎn)者與消費(fèi)者問(wèn)題。
public class Test14 {
	public static void main(String[] args) {
		Workbench tai = new Workbench(); //相當(dāng)于包子	
		Cook c = new Cook("崔志恒", tai); //生產(chǎn)者
		Waiter w = new Waiter("翠花", tai);	//消費(fèi)者
		c.start();
		w.start();
	}
}

//11111111111111111111111111111111111111111111111111111111111111111111111111
class Workbench{
	private static final int MAX = 10; //假設(shè)工作臺(tái)上最多能夠放10盤(pán)
	private int count; //count是共用的,要考慮線(xiàn)程安全	

	public synchronized void put(){ //同步方法,非靜態(tài)方法來(lái)說(shuō),鎖對(duì)象就是this //往工作臺(tái)上放一盤(pán)菜
		if(count >= MAX){
			try {
				//生產(chǎn)者停下來(lái),等待
				wait();//默認(rèn)是this.wait(),所以上面必須加鎖對(duì)象synchronized
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//上面是安全校驗(yàn)
		count++;		
		System.out.println(Thread.currentThread().getName() + "放了一盤(pán)菜,剩余:" + count);
		this.notify(); // 包子/工作臺(tái).notify()  //喚醒消費(fèi)者
	}	

//1111111111111111111111111111111111111111111111111111111111111111111111111111
	public synchronized void take(){//從工作臺(tái)上取走一盤(pán)菜
		if(count<=0){
			try {				
				wait(); //工作臺(tái)沒(méi)有菜,消費(fèi)者應(yīng)該停下來(lái)
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//上面是安全校驗(yàn)
		count--;
		System.out.println(Thread.currentThread().getName() + "取走一盤(pán)菜,剩余:" + count);
		this.notify();  //喚醒生產(chǎn)者
	}
}

//1111111111111111111111111111111111111111111111111111111111111111111111111
class Cook extends Thread{
	private Workbench tai;
	public Cook(String name, Workbench tai) {
		super(name);
		this.tai = tai;
	}
	public void run(){
		while(true){
			tai.put(); //封裝了
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

//111111111111111111111111111111111111111111111111111111111111111111111
class Waiter extends Thread{
	private Workbench tai;	
	public Waiter(String name, Workbench tai) {
		super(name); //name屬性在父類(lèi)中已聲明
		this.tai = tai;
	}
	public void run(){
		while(true){
			tai.take();
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

如下一直交替運(yùn)行,不停。

在這里插入圖片描述

如下線(xiàn)程6態(tài):鎖就是鑰匙上廁所,限時(shí)等待就是sleep,記住下面三個(gè)紅色。

在這里插入圖片描述

如下B進(jìn)不去不執(zhí)行

在這里插入圖片描述

到此這篇關(guān)于Java線(xiàn)程創(chuàng)建(賣(mài)票),線(xiàn)程同步(賣(mài)包子)的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Java線(xiàn)程創(chuàng)建同步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java scala模式匹配機(jī)制詳解

    Java scala模式匹配機(jī)制詳解

    模式匹配語(yǔ)法中,采用match關(guān)鍵字聲明,每個(gè)分支采用case關(guān)鍵字進(jìn)行聲明,當(dāng)需要匹配時(shí),會(huì)從第一個(gè)case分支開(kāi)始,如果匹配成功,那么執(zhí)行對(duì)應(yīng)的邏輯代碼,如果匹配不成功,繼續(xù)執(zhí)行下一個(gè)分支進(jìn)行判斷
    2023-02-02
  • SpringBoot測(cè)試之@SpringBootTest與MockMvc的實(shí)戰(zhàn)應(yīng)用小結(jié)

    SpringBoot測(cè)試之@SpringBootTest與MockMvc的實(shí)戰(zhàn)應(yīng)用小結(jié)

    本文將深入探討SpringBoot測(cè)試中兩個(gè)核心工具:@SpringBootTest注解與MockMvc測(cè)試框架的實(shí)戰(zhàn)應(yīng)用,幫助開(kāi)發(fā)者構(gòu)建更穩(wěn)健的測(cè)試體系,提高代碼質(zhì)量與可維護(hù)性,感興趣的朋友一起看看吧
    2025-03-03
  • Java利用DFA算法實(shí)現(xiàn)敏感詞管理

    Java利用DFA算法實(shí)現(xiàn)敏感詞管理

    我們?cè)谕瓿梢恍┪恼掳l(fā)布的功能是,可以使用第三方工具如阿里云的內(nèi)容安全來(lái)進(jìn)行文章的審核,但是這個(gè)第三方接口并不能過(guò)濾一些敏感詞,所以本文就來(lái)講講如何通過(guò)DFA算法就行敏感詞管理吧
    2024-11-11
  • java開(kāi)發(fā)之鬧鐘的實(shí)現(xiàn)代碼

    java開(kāi)發(fā)之鬧鐘的實(shí)現(xiàn)代碼

    本篇文章介紹了,在java中鬧鐘的實(shí)現(xiàn)代碼。需要的朋友參考下
    2013-05-05
  • Spring中@Autowired和@Qualifier注解的3個(gè)知識(shí)點(diǎn)小結(jié)

    Spring中@Autowired和@Qualifier注解的3個(gè)知識(shí)點(diǎn)小結(jié)

    這篇文章主要介紹了Spring中@Autowired和@Qualifier注解的3個(gè)知識(shí)點(diǎn)小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的超詳細(xì)教程

    IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的超詳細(xì)教程

    這篇文章主要介紹了IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • IDEA下lombok安裝及找不到get,set的問(wèn)題的解決方法

    IDEA下lombok安裝及找不到get,set的問(wèn)題的解決方法

    這篇文章主要介紹了IDEA下lombok安裝及找不到get,set的問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 解決java maven項(xiàng)目找不到j(luò)console-1.8.0.jar和tools-1.8.0.jar包問(wèn)題

    解決java maven項(xiàng)目找不到j(luò)console-1.8.0.jar和tools-1.8.0.jar包問(wèn)題

    這篇文章主要介紹了解決java maven項(xiàng)目找不到j(luò)console-1.8.0.jar和tools-1.8.0.jar包問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Java去重排序之Comparable與Comparator的使用及說(shuō)明

    Java去重排序之Comparable與Comparator的使用及說(shuō)明

    這篇文章主要介紹了Java去重排序之Comparable與Comparator的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java設(shè)計(jì)模式之抽象工廠(chǎng)模式詳解

    Java設(shè)計(jì)模式之抽象工廠(chǎng)模式詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之抽象工廠(chǎng)模式詳解,抽象工廠(chǎng)是一種為訪(fǎng)問(wèn)類(lèi)提供一個(gè)創(chuàng)建一組相關(guān)或相互依賴(lài)對(duì)象的接口,且訪(fǎng)問(wèn)類(lèi)無(wú)須指定所要產(chǎn)品的具體類(lèi)就能得到同族的、不同等級(jí)的產(chǎn)品的模式結(jié)構(gòu),需要的朋友可以參考下
    2023-09-09

最新評(píng)論

张家口市| 文昌市| 新乡县| 正镶白旗| 呼伦贝尔市| 太康县| 陇川县| 名山县| 吴堡县| 娄底市| 东海县| 通山县| 绵竹市| 黄陵县| 合江县| 安图县| 文昌市| 前郭尔| 石家庄市| 南昌县| 长垣县| 图片| 航空| 错那县| 乡宁县| 临江市| 徐水县| 介休市| 县级市| 资兴市| 潮安县| 安平县| 巴青县| 仙桃市| 兖州市| 东源县| 农安县| 平潭县| 伊吾县| 泰安市| 潼关县|