国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java基礎學習——多線程(線程間通信-生產者消費者代碼示例)

FuisonDesign / 3480人閱讀

摘要:提供了多線程升級方案將同步替換成了顯示的操作。線程間通信接口可以替代傳統的線程間通信,用替換,用替換,用替換。商品執行上述代碼,觀察結果可以看到,多個線程同時生產消費,由于指定喚醒互異線程,因此并不會引起錯誤。

JDK 1.5提供了多線程升級方案
將同步synchronized替換成了顯示的Lock操作??梢詫崿F喚醒、凍結指定的線程。

Lock接口
Lock 實現提供了比使用 synchronized 方法和語句可獲得的更廣泛的鎖定操作。此實現允許更靈活的結構,可以具有差別很大的屬性,可以支持多個相關的 Condition 對象。
線程間通信Condition接口
Condition可以替代傳統的線程間通信,用await()替換wait(),用signal()替換notify(),用signalAll()替換notifyAll()。該對象可以通過Lock鎖進行獲取。

傳統線程的通信方式,Condition都可以實現。

注意,Condition是被綁定到Lock上的,要創建一個Lock的Condition必須用newCondition()方法。
ReentrantLock類
Java.util.concurrent.lock 中的Lock 框架是鎖定的一個抽象,它允許把鎖定的實現作為 Java 類,而不是作為語言的特性來實現。這就為Lock 的多種實現留下了空間,各種實現可能有不同的調度算法、性能特性或者鎖定語義。

ReentrantLock 類實現了Lock ,它擁有與synchronized 相同的并發性和內存語義,但是添加了類似鎖投票、定時鎖等候和可中斷鎖等候的一些特性。此外,它還提供了在激烈爭用情況下更佳的性能。(換句話說,當許多線程都想訪問共享資源時,JVM 可以花更少的時候來調度線程,把更多時間用在執行線程上。)

用法示例:

private Lock lock = new ReentrantLock();//定義多態ReentrantLock類對象
private Condition cond_pro = lock.newCondition();//Condition是被綁定到Lock上的,要創建一個Lock的Condition必須用Lock對象的newCondition()方法。
private Condition cond_con = lock.newCondition();//一個lock可以有多個相關的condition

首先創建一個ReentrantLock類的多態對象,即建立一把鎖。然后將這把鎖與兩個Condition對象關聯。

實例:

import java.util.concurrent.locks.*;
    class ProducerConsumerDemo 
    {
        public static void main(String[] args) 
        {
            Resource r = new Resource();
            Producer pro = new Producer(r);//生產者對象
            Consumer con = new Consumer(r);//消費者對象
    
            Thread t1 = new Thread(pro);
            Thread t2 = new Thread(pro);
            Thread t3 = new Thread(con);
            Thread t4 = new Thread(con);
    
            t1.start();
            t2.start();
            t3.start();    
            t4.start();    
            }
    }
    
    class Resource
    {
        private String name;
        private int count = 1;
        private boolean flag = false;
        private Lock lock = new ReentrantLock();//定義一個實現Lock接口的ReentrantLock類對象
        private Condition cond_pro = lock.newCondition();//Condition是被綁定到Lock上的,要創建一個Lock的Condition必須用Lock對象的newCondition()方法。
           private Condition cond_con = lock.newCondition();//一個lock可以有多個相關的condition
        
        public  void set(String name) throws InterruptedException//生產方法
                                       //注意這里拋出await()方法異常聲明,交給調用者處理
        {
            lock.lock();    //手動加同步鎖
            try
            {  
                while (flag)    //if→while 此時若生產完一個以后喚醒了另一個生產者,則再次判斷,避免了兩個生產者同時生產
                    cond_pro.await();       //凍結生產方法
                this.name = name+"____"+count++;
                System.out.println(Thread.currentThread().getName()+"_______"+"生產者"+this.name);
                flag = true;
                cond_con.signal(); //喚醒消費方法,利用了condition的signal()指定喚醒對象        
            }
            finally    //
            {
                lock.unlock();
            }
        }
    
        public  void out()throws InterruptedException
        {
            lock.lock();
            try
                {
                    while (!flag)
                        cond_con.await();
                    System.out.println(Thread.currentThread().getName()+"______"+"消費者"+this.name);
                    flag = false;
                    cond_pro.signal();
                }

            finally    //釋放鎖必須得到執行
            {
                lock.unlock();
            }
        }
    }
    
    class Consumer implements Runnable
    {
        private Resource res;
        public Consumer(Resource res)
        {
            this.res = res;
        }
        public void run()
        {
            while (true)
            {
                try    //由于out()方法拋出了異常聲明,這里必須捕獲。
                {
                    res.out();
    
                }
                catch (InterruptedException e)
                {
                }
            }
            
        }
    }
    
    class Producer implements Runnable
    {
        private Resource res;
        public Producer(Resource res)
        {
        
                this.res = res;                
            
        }

        public void run()
        {
            while (true)
            {    
                try
                {
                    res.set("+商品+");
                
                }
                catch (InterruptedException e)
                {
                }
            }
    
        }
    }

執行上述代碼,觀察結果:

可以看到,多個線程同時生產、消費,由于指定喚醒互異線程,因此并不會引起錯誤。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69842.html

相關文章

  • JAVA 線程和并發基礎

    摘要:線程可以被稱為輕量級進程。一個守護線程是在后臺執行并且不會阻止終止的線程。其他的線程狀態還有,和。上下文切換是多任務操作系統和多線程環境的基本特征。在的線程中并沒有可供任何對象使用的鎖和同步器。 原文:Java Multi-Threading and Concurrency Interview Questions with Answers 翻譯:并發編程網 - 鄭旭東 校對:方騰飛 多...

    vboy1010 評論0 收藏0
  • JAVA 線程和并發基礎面試問答

    摘要:多線程和并發問題是技術面試中面試官比較喜歡問的問題之一。線程可以被稱為輕量級進程。一個守護線程是在后臺執行并且不會阻止終止的線程。其他的線程狀態還有,和。上下文切換是多任務操作系統和多線程環境的基本特征。 多線程和并發問題是 Java 技術面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,但是你仍然應該牢固的掌握Java多線程基礎知識來對應日后碰到的問題。(...

    dreamans 評論0 收藏0
  • Java 線程核心技術梳理(附源碼)

    摘要:本文對多線程基礎知識進行梳理,主要包括多線程的基本使用,對象及變量的并發訪問,線程間通信,的使用,定時器,單例模式,以及線程狀態與線程組。源碼采用構建,多線程這部分源碼位于模塊中。通知可能等待該對象的對象鎖的其他線程。 本文對多線程基礎知識進行梳理,主要包括多線程的基本使用,對象及變量的并發訪問,線程間通信,lock的使用,定時器,單例模式,以及線程狀態與線程組。 寫在前面 花了一周時...

    Winer 評論0 收藏0
  • Java 線程編程基礎——Thread 類

    摘要:程序執行時,至少會有一個線程在運行,這個運行的線程被稱為主線程。程序的終止是指除守護線程以外的線程全部終止。多線程程序由多個線程組成的程序稱為多線程程序。線程休眠期間可以被中斷,中斷將會拋出異常。 線程 我們在閱讀程序時,表面看來是在跟蹤程序的處理流程,實際上跟蹤的是線程的執行。 單線程程序 在單線程程序中,在某個時間點執行的處理只有一個。 Java 程序執行時,至少會有一個線程在運行...

    zhoutk 評論0 收藏0
  • Java并發編程之線程通訊(下)-產者費者

    摘要:前文回顧上一篇文章重點嘮叨了中協調線程間通信的機制,它有力的保證了線程間通信的安全性以及便利性。所以同一時刻廚師線程和服務員線程不會同時在等待隊列中。對于在操作系統中線程的阻塞狀態,語言中用和這三個狀態分別表示。 前文回顧 上一篇文章重點嘮叨了java中協調線程間通信的wait/notify機制,它有力的保證了線程間通信的安全性以及便利性。本篇將介紹wait/notify機制的一個應用...

    lufficc 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<