java 執行緒 二

2021-08-20 03:44:01 字數 2879 閱讀 3987

執行緒的同步和通訊是乙個重點。

很多書上講解執行緒之間的同步時,都使用了乙個售票系統。

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...