苹果系统手机调用java线程出错_Java线程面试题
2) 線程和進程有什么區別?
一個進程是一個獨立(self contained)的運行環境,它可以被看作一個程序或者一個應用。而線程是在進程中執行的一個任務。線程是進程的子集,一個進程可以有很多線程,每條線程并行執行不同的任務。不同的進程使用不同的內存空間,而所有的線程共享一片相同的內存空間。別把它和棧內存搞混,每個線程都擁有單獨的棧內存用來存儲本地數據。
3) 如何在Java中實現線程?
有兩種創建線程的方法:一是實現Runnable接口,然后將它傳遞給Thread的構造函數,創建一個Thread對象;二是直接繼承Thread類。
4) 用Runnable還是Thread?
這個問題是上題的后續,大家都知道我們可以通過繼承Thread類或者調用Runnable接口來實現線程,問題是,那個方法更好呢?什么情況下使用它?這個問題很容易回答,如果你知道Java不支持類的多重繼承,但允許你調用多個接口。所以如果你要繼承其他類,當然是調用Runnable接口好了。
5) Thread 類中的start() 和 run() 方法有什么區別?
start()方法被用來啟動新創建的線程,使該被創建的線程狀態變為可運行狀態。當你調用run()方法的時候,只會是在原來的線程中調用,沒有新的線程啟動,start()方法才會啟動新線程。如果我們調用了Thread的run()方法,它的行為就會和普通的方法一樣,直接運行run()方法。為了在新的線程中執行我們的代碼,必須使用Thread.start()方法。
6) Java中CyclicBarrier 和 CountDownLatch有什么不同?
CyclicBarrier 和 CountDownLatch 都可以用來讓一組線程等待其它線程。與 CyclicBarrier 不同的是,CountdownLatch 不能重新使用。
7) Java內存模型是什么?
Java內存模型規定和指引Java程序在不同的內存架構、CPU和操作系統間有確定性地行為。它在多線程的情況下尤其重要。Java內存模型對一個線程所做的變動能被其它線程可見提供了保證,它們之間是先行發生關系。這個關系定義了一些規則讓程序員在并發編程時思路更清晰。比如,先行發生關系確保了:
線程內的代碼能夠按先后順序執行,這被稱為程序次序規則。
對于同一個鎖,一個解鎖操作一定要發生在時間上后發生的另一個鎖定操作之前,也叫做管程鎖定規則。
前一個對volatile的寫操作在后一個volatile的讀操作之前,也叫volatile變量規則。
一個線程內的任何操作必需在這個線程的start()調用之后,也叫作線程啟動規則。
一個線程的所有操作都會在線程終止之前,線程終止規則。
一個對象的終結操作必需在這個對象構造完成之后,也叫對象終結規則。
可傳遞性
8) 什么是線程安全?Vector是一個線程安全類嗎?
如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。一個線程安全的計數器類的同一個實例對象在被多個線程使用的情況下也不會出現計算失誤。很顯然你可以將集合類分成兩組,線程安全和非線程安全的。Vector 是用同步方法來實現線程安全的, 而和它相似的ArrayList不是線程安全的。
9) 一個線程運行時發生異常會怎樣?
如果異常沒有被捕獲該線程將會停止執行。Thread.UncaughtExceptionHandler是用于處理未捕獲異常造成線程突然中斷情況的一個內嵌接口。當一個未捕獲異常將造成線程中斷的時候JVM會使用Thread.getUncaughtExceptionHandler()來查詢線程的UncaughtExceptionHandler并將線程和異常作為參數傳遞給handler的uncaughtException()方法進行處理。
10) Java中的fork join框架是什么?
ork join框架是JDK7中出現的一款高效的工具,Java開發人員可以通過它充分利用現代服務器上的多處理器。它是專門為了那些可以遞歸劃分成許多子模塊設計的,目的是將所有可用的處理能力用來提升程序的性能。fork join框架一個巨大的優勢是它使用了工作竊取算法,可以完成更多任務的工作線程可以從其它線程中竊取任務來執行。
11) 什么是FutureTask?
FutureTask包裝器是一種非常便利的機制,可將Callable轉換成Future和Runnable,它同時實現兩者的接口。
FutureTask類是Future 的一個實現,并實現了Runnable,所以可通過Excutor(線程池) 來執行。也可傳遞給Thread對象執行。如果在主線程中需要執行比較耗時的操作時,但又不想阻塞主線程時,可以把這些作業交給Future對象在后臺完成,當主線程將來需要時,就可以通過Future對象獲得后臺作業的計算結果或者執行狀態。
12) 什么是并發容器的實現?
Java集合類都是快速失敗的,這就意味著當集合被改變且一個線程在使用迭代器遍歷集合的時候,迭代器的next()方法將拋出ConcurrentModificationException異常。
并發容器:并發容器是針對多個線程并發訪問設計的,在jdk5.0引入了concurrent包,其中提供了很多并發容器,如ConcurrentHashMap,CopyOnWriteArrayList等。并發容器使用了與同步容器完全不同的加鎖策略來提供更高的并發性和伸縮性,例如在ConcurrentHashMap中采用了一種粒度更細的加鎖機制,可以稱為分段鎖,在這種鎖機制下,允許任意數量的讀線程并發地訪問map,并且執行讀操作的線程和寫操作的線程也可以并發的訪問map,同時允許一定數量的寫操作線程并發地修改map,所以它可以在并發環境下實現更高的吞吐量。
13)線程之間是如何通信的?
當線程間是可以共享資源時,線程間通信是協調它們的重要的手段。Object類中wait()\notify()\notifyAll()方法可以用于線程間通信關于資源的鎖的狀態。
14)為什么Thread類的sleep()和yield()方法是靜態的?
Thread類的sleep()和yield()方法將在當前正在執行的線程上運行。所以在其他處于等待狀態的線程上調用這些方法是沒有意義的。這就是為什么這些方法是靜態的。它們可以在當前正在執行的線程中工作,并避免程序員錯誤的認為可以在其他非運行線程調用這些方法。
15)如何確保線程安全?
在Java中可以有很多方法來保證線程安全——同步,使用原子類(atomic concurrent classes),實現并發鎖,使用volatile關鍵字,使用不變類和線程安全類。
16)同步方法和同步塊,哪個是更好的選擇?
同步塊是更好的選擇,因為它不會鎖住整個對象(當然你也可以讓它鎖住整個對象)。同步方法會鎖住整個對象,哪怕這個類中有多個不相關聯的同步塊,這通常會導致他們停止執行并需要等待獲得這個對象上的鎖。
18)如何創建守護線程?
使用Thread類的setDaemon(true)方法可以將線程設置為守護線程,需要注意的是,需要在調用start()方法前調用這個方法,否則會拋出IllegalThreadStateException異常。
19) 在線程中你怎么處理不可捕捉異常?
Thread.UncaughtExceptionHandler是java SE5中的新接口,它允許我們在每一個Thread對象上添加一個異常處理器。
以上就是熱門Java多線程和并發面試題啦,這篇文章不僅可以用來準備面試,還能檢查你對多線程、并發、設計模式和競態條件、死鎖和線程安全等線程問題的理解。
這篇文章對初學者或者是經驗豐富的Java開發人員都很有用,過兩三年甚至五六年你再讀它也會受益匪淺。它可以擴展初學者尤其有用因為這個可以擴展他們的知識面,我會不斷更新這些題,大家可以在文章后面的評論中提問,分享和回答問題一起把這篇面試題完善。
今天給大家的分享就到這吧!有收獲,需要面試題的可以關注小編同時也歡迎大家加入小編的Java交流群937053620,大家一起交流成長!!
總結
以上是生活随笔為你收集整理的苹果系统手机调用java线程出错_Java线程面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信公众号订阅通知(go+vue)
- 下一篇: 前端面试题及答案(字节跳动)(二)