1. 程式人生 > >對java多執行緒的一些淺淺的理解

對java多執行緒的一些淺淺的理解

     作為一名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~