對java多執行緒的一些淺淺的理解
阿新 • • 發佈:2019-02-05
作為一名JAVA初學者,前幾天剛剛接觸多執行緒這個東西,有了些微微的理解想寫下來(不對的地方請多多包涵並指教哈)。
多執行緒怎麼寫程式碼就不說了,一搜一大堆。說說多執行緒我認為最難搞的地方,就是來回釋放鎖以及執行緒等待和喚醒的時機。首先先明確一下wait()與notify()的基本用法,wait方法導致當前執行緒(設為A)釋放所持有的鎖並等待直到其他執行緒(設為B)喚醒它(A執行緒)為止,注意,喚醒執行緒(B執行緒)所持有的鎖應該和等待執行緒(A執行緒)所釋放的鎖是相同的。也就是說,為了人為控制某些執行緒的順序而不得已使用的方法,等待執行緒(A執行緒)對某物件進行操作之前必須讓喚醒執行緒(B執行緒)先操作這個物件。
看程式碼
synchronized(detail){ for(int i=front_num;i<=now_num;i++){ detail.queue.add(new Product_detail(detail.getName(),i)); System.out.println(detail.getName()+"已被生產,編號為:"+i); } detail.notify(); }
這是最簡單的消費者生產者執行緒的生產執行緒的部分程式碼,就是把生產好的東西往佇列裡塞,但是生產執行緒執行這段程式碼的時候把detail這個物件鎖上了,也就是說:“其他執行緒先別用,我用完再說。” 生產之後緊接著就一句notify喚醒等待使用detail這個物件的執行緒。
synchronized(detail){ try { detail.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
這是消費執行緒的對應程式碼,意思是說一旦消費執行緒獲得了detail的物件鎖就停住並釋放物件鎖,等著被生產執行緒喚醒,就為了在一定程度上避免消費執行緒先執行所出現的麻煩。
不過這樣寫可能會造成庫存,嘎嘎。。。。先寫到這造成庫存的原因很明顯的O(∩_∩)O~