2020-04-16線程同步控制

  • 同步控制:是指同一資源只能同時(shí)被一個(gè)對(duì)象調(diào)用,當(dāng)這個(gè)對(duì)象調(diào)用結(jié)束后才能被其他的對(duì)象調(diào)用
  • 在所要調(diào)用的方法前加上synchronized
  • 例:synchronized char get(){};
    *注意的是:1.當(dāng)用synchronized注釋多個(gè)方法的時(shí)候,使得這些方法“連在一起”
  • 當(dāng)有一對(duì)象調(diào)用其中的一個(gè)方法的時(shí)候,別的對(duì)象無(wú)法對(duì)其他的方法進(jìn)行調(diào)用
  • 2.標(biāo)識(shí)的資源可以是一種類型的數(shù)據(jù),也就是對(duì)象,也可以是一個(gè)方法,也可以是一段代碼
  • 當(dāng)我們對(duì)整個(gè)類進(jìn)行標(biāo)識(shí)的時(shí)候,就會(huì)使得這類之中的所有的東西同一時(shí)間只能被一個(gè)對(duì)象調(diào)用
  • 3.當(dāng)我們編寫(xiě)程序的時(shí)候最好將定義同步的類和實(shí)現(xiàn)其他的方法的類分開(kāi),以免弄混,使得程序出錯(cuò)

/**
 * @Author 李騰飛
 */
class Common{//定義同步資源
    private char ch;
    private boolean available=false;
    synchronized char get(){
        while(available==false)
            try
            {
                wait();//當(dāng)沒(méi)有產(chǎn)品時(shí),一直掛起,不能進(jìn)行售賣(mài)
            }
        catch (InterruptedException e){}
    available=false;
            notify();
            return ch;
    }
    synchronized void put(char newch){//當(dāng)對(duì)象調(diào)用這個(gè)方法的時(shí)候就會(huì)得到互斥鎖,使之避免多個(gè)線程對(duì)同一自資源的訪問(wèn)
        while(available==true)
            try
            {
                wait();//當(dāng)有產(chǎn)品的時(shí)候,就一直掛起,不進(jìn)行上架
            }
        catch(InterruptedException e){}
        ch=newch;
            available=true;
            notify();
    }
}
class Produce extends Thread {
    private Common comm;
    public Produce(Common thiscomn){
        comm=thiscomn;
    }
    public  void run(){
        char c;
        for (c='a';c<'e';c++){
            System.out.println("生產(chǎn)的數(shù)據(jù)是:"+c);
            comm.put(c);
        }
    }
}
class Consumer implements Runnable{
    private Common comm;

    public Consumer(Common thisComm) {
        comm = thisComm;
    }
    public void run(){
        char c;
            for (int i=0; i<5;i++){
                c=comm.get();
                System.out.println("消費(fèi)者得到的數(shù)據(jù)是:"+c);
            }
        }
    }

public class 線程同步控制 {
    public static void main(String[] args) {


        Common comm = new Common();
        Produce p = new Produce(comm);
        Consumer c = new Consumer(comm);
        p.start();
       new Thread(c).start();//注意此時(shí)的激活程序只能放在main函數(shù)之中
}}
注意激活線程時(shí)的注意點(diǎn):
Consumer v=new Consumer(comm);
此時(shí)的V雖然是實(shí)現(xiàn)Runnable接口的類的對(duì)象,但是Thread之中的很多方法卻不能夠進(jìn)行使用
  想要使用 Thread的方法就要重新定義一個(gè)Thread線程,將所建的對(duì)象作為參數(shù)放入其中
 此時(shí)參數(shù)的run()方法就會(huì)被線程所調(diào)用
  new Thread(v).start();//創(chuàng)建Thread類的匿名對(duì)象,將v作為參數(shù)放入其中,再調(diào)用start方法將線程激活
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等。 首先講...
    李欣陽(yáng)閱讀 2,597評(píng)論 1 15
  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 3,108評(píng)論 1 18
  • 相關(guān)概念 面向?qū)ο蟮娜齻€(gè)特征 封裝,繼承,多態(tài).這個(gè)應(yīng)該是人人皆知.有時(shí)候也會(huì)加上抽象. 多態(tài)的好處 允許不同類對(duì)...
    東經(jīng)315度閱讀 2,192評(píng)論 0 8
  • 林炳文Evankaka原創(chuàng)作品。轉(zhuǎn)載自http://blog.csdn.net/evankaka 本文主要講了ja...
    ccq_inori閱讀 735評(píng)論 0 4
  • 對(duì)象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構(gòu)造函數(shù)創(chuàng)建對(duì)象:僅僅是創(chuàng)建對(duì)象的方法,并非Fa...
    孫小磊閱讀 2,184評(píng)論 0 3

友情鏈接更多精彩內(nèi)容