华南俳烁实业有限公司

java

當(dāng)前位置:中華考試網(wǎng) >> java >> java面試題 >> 文章內(nèi)容

JavaSE面試題:多線程

來源:中華考試網(wǎng)  [2020年10月20日]  【

  Q:線程和進(jìn)程的區(qū)別?

  進(jìn)程:

  具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。

  線程:

  是進(jìn)程的一個(gè)實(shí)體,是 cpu 調(diào)度和分派的基本單位,是比進(jìn)程更小的可以獨(dú)立運(yùn)行的基本單位。

  特點(diǎn):

  線程的劃分尺度小于進(jìn)程,這使多線程程序擁有高并發(fā)性,

  進(jìn)程在運(yùn)行時(shí)各自內(nèi)存單元相互獨(dú)立,線程之間內(nèi)存共享,

  這使多線程編程可以擁有更好的性能和用戶體驗(yàn)

  注意:多線程編程對(duì)于其它程序是不友好的,占據(jù)大量 cpu 資源。

  Q:一個(gè)Java應(yīng)用程序至少有幾個(gè)線程?

  兩個(gè):

  主線程:負(fù)責(zé)main方法代碼的執(zhí)行,

  垃圾回收器線程:負(fù)責(zé)了回收垃圾。

  Q:如何停止一個(gè)線程?

  Thread.stop(),不建議使用

  通過一個(gè)變量去控制,當(dāng)符合這個(gè)條件時(shí),自動(dòng)結(jié)束。

  interrupt()

  Q:sleep() 和 wait() 有什么區(qū)別?

  sleep()方法:

  Thread類中的靜態(tài)方法,

  當(dāng)一個(gè)線程調(diào)用sleep()方法以后,不會(huì)釋放同步資源鎖,其他線程仍然會(huì)等待資源鎖的釋放。

  wait()方法:

  Object類提供的一個(gè)普通方法,

  而且必須同同步資源鎖對(duì)象在同步代碼塊或者同步方法中調(diào)用。

  當(dāng)調(diào)用wait()方法后,當(dāng)前線程會(huì)立刻釋放掉同步鎖資源。其他線程就有機(jī)會(huì)獲得同步資源鎖從而繼續(xù)往下執(zhí)行。

  Q:多線程的創(chuàng)建方式?

  方式一:繼承 Thread 類

  Thread 本質(zhì)上也是實(shí)現(xiàn)了 Runnable 接口的一個(gè)實(shí)例,它代表一個(gè)線程的實(shí)例,并且,啟動(dòng)線程的唯一方法就是通過 Thread 類的 start()實(shí)例方法。start()方法是一個(gè) native 方法,它將啟動(dòng)一個(gè)新線程,并執(zhí)行 run()方法。這種方式實(shí)現(xiàn)多線程很簡(jiǎn)單,通過自己的類直接 extend Thread,并重寫 run()方法,就可以啟動(dòng)新線程并執(zhí)行自己定義的 run()方法。例如:繼承 Thread 類實(shí)現(xiàn)多線程,并在合適的地方啟動(dòng)線程。

  1public class MyThread extends Thread {2 public void run() {3 System.out.println("MyThread.run()");4}56MyThread myThread1 = new MyThread();7MyThread myThread2 = new MyThread();8myThread1.start();9myThread2.start();

  方式二:實(shí)現(xiàn) Runnable 接口的方式實(shí)現(xiàn)多線程,并且實(shí)例化 Thread,傳入自己的 Thread 實(shí)例,調(diào)用 run( )方法

  1public class MyThread implements Runnable {2 public void run() {3 System.out.println("MyThread.run()");4 }5}6 MyThread myThread = new MyThread();7 Thread thread = new Thread(myThread);8 thread.start();

  方式三:通過Callable和Future創(chuàng)建線程

  1 class T implements Callable {2 @Override3 public String call() throws Exception {4 return null;5 }6 }

  Q:談?wù)勀銓?duì)線程池的理解?jdk提供了哪幾種線程池?他們有什么區(qū)別?

  線程池可以提高線程的創(chuàng)建和銷毀的開銷

  jdk提供了以下幾種線程池:

  new SingleThreadExecutor(單線程的線程池)

  只有一個(gè)線程在執(zhí)行,相對(duì)于單線程執(zhí)行任務(wù)

  new FixedThreadPool(固定線程數(shù)的線程池)

  固定線程數(shù)處理任務(wù);當(dāng)任務(wù)過多,則固定的線程數(shù)誰先執(zhí)行完任務(wù),就執(zhí)行剩余任務(wù)

  new ScheduledThreadPool(控制線程池定時(shí)周期任務(wù)執(zhí)行)

  new CachedThreadPool(可緩存的線程池)

  一般工作中使用的是new ThreadPoolExecutor

  Q:說一下ThreadPoolExecutor各個(gè)參數(shù)的含義?

  1ThreadPoolExecutor(2 int corePoolSize, //核心線程池大小3 int maximumPoolSize, //最大線程池大小4 long keepAliveTime, //線程最大空閑時(shí)間5 TimeUnit unit, //時(shí)間單位6 BlockingQueue workQueue, //線程等待隊(duì)列7 ThreadFactory threadFactory, //線程創(chuàng)建工廠8 RejectedExecutionHandler handler //拒絕策略9 ) {

  Q:說一下線程的生命周期?

  新建狀態(tài)(New):

  當(dāng)線程對(duì)象對(duì)創(chuàng)建后,即進(jìn)入了新建狀態(tài),如:Thread thread= new MyThread();

  就緒狀態(tài)(Runnable):

  當(dāng)調(diào)用線程對(duì)象的start()方法(t.start();),線程即進(jìn)入就緒狀態(tài)。處于就緒狀態(tài)的線程,只是說明此線程已經(jīng)做好了準(zhǔn)備,隨時(shí)等待CPU調(diào)度執(zhí)行,并不是說執(zhí)行了t.start()此線程立即就會(huì)執(zhí)行;

  運(yùn)行狀態(tài)(Running):

  當(dāng)CPU開始調(diào)度處于就緒狀態(tài)的線程時(shí),此時(shí)線程才得以真正執(zhí)行,即進(jìn)入到運(yùn)行狀態(tài)。

  阻塞狀態(tài)(Blocked):

  處于運(yùn)行狀態(tài)中的線程由于某種原因,暫時(shí)放棄對(duì)CPU的使用權(quán),停止執(zhí)行,此時(shí)進(jìn)入阻塞狀態(tài),直到其進(jìn)入到就緒狀態(tài),才有機(jī)會(huì)再次被CPU調(diào)用以進(jìn)入到運(yùn)行狀態(tài)。根據(jù)阻塞產(chǎn)生的原因不同,阻塞狀態(tài)又可以分為三種:

 、俚却枞哼\(yùn)行狀態(tài)中的線程執(zhí)行wait()方法,使本線程進(jìn)入到等待阻塞狀態(tài);

 、谕阶枞壕程在獲取synchronized同步鎖失敗(因?yàn)殒i被其它線程所占用),它會(huì)進(jìn)入同步阻塞狀態(tài);

 、燮渌枞和ㄟ^調(diào)用線程的sleep()或join()或發(fā)出了I/O請(qǐng)求時(shí),線程會(huì)進(jìn)入到阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時(shí)、join()等待線程終止或者超時(shí)、或者I/O處理完畢時(shí),線程重新轉(zhuǎn)入就緒狀態(tài)。

  死亡狀態(tài)(Dead):

  線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。

責(zé)編:fushihao
  • 會(huì)計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語考試
  • 學(xué)歷考試
潼关县| 通海县| 静乐县| 山阳县| 永寿县| 安乡县| 仙桃市| 绥宁县| 突泉县| 明溪县| 安国市| 礼泉县| 察哈| 宁乡县| 普定县| 闻喜县| 冕宁县| 沙湾县| 资讯 | 同江市| 普格县| 伽师县| 高安市| 揭西县| 濮阳市| 成武县| 孟州市| 元阳县| 章丘市| 莱阳市| 赤城县| 拉孜县| 北辰区| 平塘县| 闸北区| 横山县| 句容市| 应城市| 盐亭县| 成都市| 梧州市|