更新時間:2020-06-05 13:49:22 來源:動力節(jié)點 瀏覽3446次
1.如何在兩個線程間共享數(shù)據(jù)
通過在線程之間共享對象就可以了,然后通過wait/notify/notifyAll、await/signal/signalAll進行喚起和等待,比方說阻塞隊列BlockingQueue就是為線程之間共享數(shù)據(jù)而設(shè)計的
2.如果你提交任務(wù)時,線程池隊列已滿,這時會發(fā)生什么
如果你使用的LinkedBlockingQueue,也就是無界隊列的話,沒關(guān)系,繼續(xù)添加任務(wù)到阻塞隊列中等待執(zhí)行,因為LinkedBlockingQueue可以近乎認為是一個無窮大的隊列,可以無限存放任務(wù);
如果你使用的是有界隊列比方說ArrayBlockingQueue的話,任務(wù)首先會被添加到ArrayBlockingQueue中,ArrayBlockingQueue滿了,則會使用拒絕策略RejectedExecutionHandler處理滿了的任務(wù),默認是AbortPolicy。
3.為什么要使用線程池
避免頻繁地創(chuàng)建和銷毀線程,達到線程對象的重用。另外,使用線程池還可以根據(jù)項目靈活地控制并發(fā)的數(shù)目。
4.Thread.sleep(0)的作用是什么
由于Java采用搶占式的線程調(diào)度算法,因此可能會出現(xiàn)某條線程常常獲取到CPU控制權(quán)的情況,為了讓某些優(yōu)先級比較低的線程也能獲取到CPU控制權(quán),可以使用Thread.sleep(0)手動觸發(fā)一次操作系統(tǒng)分配時間片的操作,這也是平衡CPU控制權(quán)的一種操作。
5.為什么wait,nofity和nofityAll這些方法不放在Thread類當(dāng)中
一個很明顯的原因是JAVA提供的鎖是對象級的而不是線程級的,每個對象都有鎖,通過線程獲得。如果線程需要等待某些鎖那么調(diào)用對象中的wait()方法就有意義了。如果wait()方法定義在Thread類中,線程正在等待的是哪個鎖就不明顯了。
簡單的說,由于wait,notify和notifyAll都是鎖級別的操作,所以把他們定義在Object類中因為鎖屬于對象。
6.怎么喚醒一個阻塞的線程
如果線程是因為調(diào)用了wait()、sleep()或者join()方法而導(dǎo)致的阻塞,可以中斷線程,并且通過拋出InterruptedException來喚醒它;如果線程遇到了IO阻塞,無能為力,因為IO是操作系統(tǒng)實現(xiàn)的,Java代碼并沒有辦法直接接觸到操作系統(tǒng)。
7.什么是多線程的上下文切換
多線程的上下文切換是指CPU控制權(quán)由一個已經(jīng)正在運行的線程切換到另外一個就緒并等待獲取CPU執(zhí)行權(quán)的線程的過程。
8.一個線程如果出現(xiàn)了運行時異常怎么辦?
如果這個異常沒有被捕獲的話,這個線程就停止執(zhí)行了。另外重要的一點是:如果這個線程持有某個某個對象的監(jiān)視器,那么這個對象監(jiān)視器會被立即釋放
9.什么是線程局部變量ThreadLocal
線程局部變量是局限于線程內(nèi)部的變量,屬于線程自身所有,不在多個線程間共享。Java提供ThreadLocal類來支持線程局部變量,是一種實現(xiàn)線程安全的方式。
但是在管理環(huán)境下(如web服務(wù)器)使用線程局部變量的時候要特別小心,在這種情況下,工作線程的生命周期比任何應(yīng)用變量的生命周期都要長。任何線程局部變量一旦在工作完成后沒有釋放,Java應(yīng)用就存在內(nèi)存泄露的風(fēng)險。
10.FutureTask是什么
FutureTask表示一個異步運算的任務(wù)。FutureTask里面可以傳入一個Callable的具體實現(xiàn)類,可以對這個異步運算的任務(wù)的結(jié)果進行等待獲取、判斷是否已經(jīng)完成、取消任務(wù)等操作。
當(dāng)然,由于FutureTask也是Runnable接口的實現(xiàn)類,所以FutureTask也可以放入線程池中。
以上就是動力節(jié)點java培訓(xùn)機構(gòu)的小編針對“國企的一些基礎(chǔ)Java筆試題”的內(nèi)容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743