1、thread run和start區別數據庫
run:它是一個普通的成員方法,調用run方法的話,會在當前線程中執行run方法,而不會啓動新線程。多線程
start:會啓動一個新線程,新線程會執行相應的run方法。spa
2、什麼是多線程同步線程
在多線程狀況下,同步能夠控制對共享資源的訪問,若是沒有同步,當一個線程修改一個共享變量時,另外一個線程使用該變量時也會受到影響。對象
3、實現多線程的幾種方式繼承
1.實現Runnable接口接口
2.繼承Thread類隊列
3. 實現Callable有返回結果的多線程進程
注:Callable與Runnable使用方法大同小異;Callable 使用call()方法,Runnable使用run()方法;資源
Callable 帶返回結果,Runnable不帶返回結果;call拋出受檢查的異常( Exception ),而Runnable沒有。
4、ThreadLocal
ThreadLocal是一個線程級別的局部變量 , ThreadLocal爲每一個使用該變量的線程提供了一個獨立的變量副本, 每一個線程修改副本時不影響其它線程對象的副本 。
經常使用的使用可在DAO模式中見到,當DAO類做爲一個單例類時,數據庫連接(connection)被每個線程獨立的維護,互不影響。(基於線程的單例)
5、sleep()和wait()區別
sleep()是一個靜態方法 , 這意味着只對當前線程有效 , 即使是執行t.sleep(),也是當前線程進入睡眠,而不是t線程。 wait是object的方法而不是thread, 調用object.wait()時,線程先要獲取這個對象的對象鎖, 把當前線程添加到等待隊列中, 隨後另外一線程能夠同步同一個對象鎖來調用object.notify(),這樣將喚醒原來等待中的線程,而後釋放該鎖。
6、在靜態方法上使用同步會怎樣
同步靜態方法時會獲取該類的「Class」對象,因此當一個線程進入同步的靜態方法中時,線程監視器獲取類自己的對象鎖,其它線程不能進入這個類的任何靜態同步方法。它不像實例方法,由於多個線程能夠同時訪問不一樣實例同步實例方法。
7、 在一個對象上兩個線程能夠調用兩個不一樣的同步實例方法嗎
不能夠, 由於一個對象已經同步了實例方法,線程就獲取了對象的對象鎖。
8、什麼是死鎖
死鎖就是兩個或兩個以上的線程被無限的阻塞,線程之間相互等待所需資源。這種狀況可能發生在當兩個線程嘗試獲取其它資源的鎖,而每一個線程又陷入無限等待其它資源鎖的釋放,除非一個用戶進程被終止。就JavaAPI而言,線程死鎖可能發生在一下狀況。
●當兩個線程相互調用Thread.join()
●當兩個線程使用嵌套的同步塊,一個線程佔用了另一個線程必需的鎖,互相等待時被阻塞就有可能出現死鎖。