Java多線程中常見的幾個問題_java

來源:互聯網
上載者:User

我們都知道,在java中要想實現多線程,有兩種手段,一種是繼續Thread類,另外一種是實現Runable介面。
  1.進程和線程的區別是什嗎?
  進程是執行著的應用程式,而線程是進程內部的一個執行序列。一個進程可以有多個線程。線程又叫做輕量級進程。
  2.建立線程有幾種不同的方式?你喜歡哪一種?為什嗎?
有三種方式可以用來建立線程:
(1)繼承Thread類
(2)實現Runnable介面
(3)應用程式可以使用Executor架構來建立線程池
實現Runnable介面這種方式更受歡迎,因為這不需要繼承Thread類。在應用設計中已經繼承了別的對象的情況下,這需要多繼承(而Java不支援多繼承),只能實現介面。同時,線程池也是非常高效的,很容易實現和使用。
  3.概括的解釋下線程的幾種可用狀態。
線程在執行過程中,可以處於下面幾種狀態:
就緒(Runnable):線程準備運行,不一定立馬就能開始執行。
運行中(Running):進程正在執行線程的代碼。
等待中(Waiting):線程處於阻塞的狀態,等待外部的處理結束。
睡眠中(Sleeping):線程被強制睡眠。
I/O阻塞(Blocked on I/O):等待I/O操作完成。
同步阻塞(Blocked on Synchronization):等待擷取鎖。
死亡(Dead):線程完成了執行。
  4.同步方法和同步代碼塊的區別是什嗎?
  在Java語言中,每一個對象有一把鎖。線程可以使用synchronized關鍵字來擷取對象上的鎖。synchronized關鍵字可應用在方法層級(廣泛鎖定)或者是代碼塊層級(細部鎖定)。
  5.在監視器(Monitor)內部,是如何做線程同步的?程式應該做哪種層級的同步?
  監視器和鎖在Java虛擬機器中是一塊使用的。監視器監視一塊同步代碼塊,確保一次只有一個線程執行同步代碼塊。每一個監視器都和一個對象引用相關聯。線程在擷取鎖之前不允許執行同步代碼。
  6.什麼是死結(deadlock)?
  兩個進程都在等待對方執行完畢才能繼續往下執行的時候就發生了死結。結果就是兩個進程都陷入了無限的等待中。
  7.如何確保N個線程可以訪問N個資源同時又不導致死結?
  使用多線程的時候,一種非常簡單的避免死結的方式就是:指定擷取鎖的順序,並強制線程按照指定的順序擷取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會出現死結了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.