執行緒的同步和通訊是乙個重點。
很多書上講解執行緒之間的同步時,都使用了乙個售票系統。
public class threaddemo2 implements runnable catch (interruptedexception e)
system.out.println("售出第"+(i--)+"張票"+"-----"+thread.currentthread().getname());
}} public static void main(string args)
看一下效果圖:
會發現,視窗一和視窗二都買出了第98張票。這樣是不行啊,所以只能使用同步了。
接下來介紹乙個關鍵字,synchronized關鍵字,實現同步**塊。
public class threaddemo2 implements runnable catch (interruptedexception e)
system.out.println("售出第"+(i--)+"張票"+"-----"+thread.currentthread().getname());}}
} public static void main(string args)
}
效果圖:
我們會發現,售出的票沒有了重複。
加乙個題外話,今天我去亞信面試,就是乙個校招,做了乙份題,裡面有個執行緒題,結果是什麼?
new thread(new runnable()
}).run();
我當時沒仔細看,說,沒有start(),所以沒有任何結果。還是年輕,全部都是套路,他並沒有呼叫start()方法,但是呼叫了run()方法,這個**的意思就是說,乙個thread的子類物件,呼叫run()方法,輸出的是字串"haha",這樣run()方法就相當於是乙個普通的方法,並沒有涉及到執行緒,因為這個執行緒並沒有開啟。
synchronized關鍵字還可以用在方法上
public class threaddemo2 implements runnable
public synchronized void haha() catch (interruptedexception e)
system.out.println("售出第"+(i--)+"張票"+"-----"+thread.currentthread().getname());
}} public static void main(string args)
}
和上面是有synchronized實現同步**塊的效果一樣。
大家會發現,使用synchronized實現的方法或者是同步**塊,只要乙個執行緒占用其同步鎖,其他執行緒是無法獲得執行權的。這就是我們的效果,每次只有乙個執行緒進行買票操作。
同步鎖:
lock(),實現加鎖操作,unlock()釋放同步鎖。
public class threaddemo2 implements runnable catch (interruptedexception e)
system.out.println("售出第"+(i--)+"張票"+"-----"+thread.currentthread().getname());
lock.unlock();}}
public static void main(string args)
}
效果圖:既有線程一,又有執行緒二
——執行緒之間通訊,簡單介紹
執行緒之間的通訊的方法,全部定義在object類裡面
public class object
public final native class> getclass();
public native int hashcode();
public boolean equals(object obj)
protected native object clone() throws clonenotsupportedexception;
public string tostring()
public final native void notify();
public final native void notifyall();
public final native void wait(long timeout) throws interruptedexception;
public final void wait(long timeout, int nanos) throws interruptedexception
if (nanos < 0 || nanos > 999999)
if (nanos > 0)
wait(timeout);
}public final void wait() throws interruptedexception
protected void finalize() throws throwable
}
通訊常用的就是wait(),notify(),notifyall()。 Java執行緒(二)
昨天我們認識了什麼是執行緒和實現他的兩種方式,今天我們再進一步了解。執行緒的狀態轉換是執行緒控制的基礎。執行緒狀態總的可分為五大狀態 分別是生 死 可執行 執行 等待 阻塞。如下圖 上圖能夠清晰的看出執行緒見得狀態是如何轉換的,並且標註了在不同的狀態執行緒對cpu的資源使用情況。其中對執行緒操作的方...
Java執行緒(二)
今天重新整理關於concurrent包的使用。lock 介面,提供了synchronized的功能,同時額外增加複雜性,處理複雜問題的能力,因為在synchronized的時候,可以順序的獲取多個鎖,同時也需要倒序的釋放這些鎖,碰到一些情況這個就不能滿足了,這時候lock就可以,它實現了鎖在不同作用...
Java 多執行緒 二
執行緒安全問題 引出同步 塊 通過下面的例子,了解傳統多執行緒存在的執行緒安全隱患。需求 買票 四個視窗同時買票。class ticket implements runnable extends thread catch exception e system.out.println thread.c...