用代碼說話:如何在Java中實現線程

併發編程是Java語言的重要特性之一,「如何在Java中實現線程」是學習併發編程的入門知識,也是Java工程師面試必備的基礎知識。本文從線程提及,而後用代碼說明如何在Java中實現線程。html

1、什麼是線程?

線程是操做系統可以進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運做單位。程序員能夠經過它進行多處理器編程,也可使用多線程對運算密集型任務提速。若是使用得當,線程能夠有效地下降程序的開發和運維成本,同時可以提高程序的性能。java

2、線程和進程有什麼區別?

線程是進程的子集,一個進程能夠有不少線程。每一個進程都有本身的內存空間,可執行代碼和惟一進程標識符(PID)。程序員

每條線程並行執行不一樣的任務。不一樣的進程使用不一樣的內存空間(線程本身的堆棧),而全部的線程共享一片相同的內存空間(進程主內存)。別把它和棧內存搞混,每一個線程都擁有單獨的棧內存用來存儲本地數據。面試

3、如何在Java中實現線程?

「如何在Java中實現線程」是學習併發編程入門的必備知識,對於這個問題也是衆說紛紜?打開百度搜索一下,一看便知。在信息爆炸的時代,我認爲像孫悟空同樣有一雙火眼金睛是很必要的,分辨出哪些觀點更加準確,才能少走彎路。編程

那究竟有幾種方法能夠實現線程?哪一家的言論更權威,被更多的開發者所認同呢?毋庸置疑,固然是官網文檔了。文檔地址api

如圖中所示:多線程

There are two ways to create a new thread of execution.併發

One is to declare a class to be a subclass of Thread. ...oracle

The other way to create a thread is to declare a class that implements the Runnable interface. ...運維

如今能夠確定地說,在Java中實現線程有兩種方式, 分別是繼承 Thread 類和實現 Runnable 接口。下面分別用兩種方式實現線程。

  • 方法一:繼承Thread類。
public class MyThread extends Thread {

    public static void main(String[] args) {
        new MyThread().start();
    }

    @Override
    public void run() {
        System.out.println("用Thread類實現線程");
    }
}
  • 方法二:實現Runnable接口。
public class MyRunnable implements Runnable {

    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }

    @Override
    public void run() {
        System.out.println("用Runnable接口實現線程");
   }
}
  • 深刻分析

深刻去看Thread類的源碼,能夠看到Thread類實現了Runnable接口。

而且Thread類重寫了run方法, run 方法的代碼以下:

看過源碼能夠發現,其實兩種方法實現線程的本質是同樣的,都是最終調用了 start()方法來新建線程。這兩個方法的最主要區別在於 run()方法的內容來源:

繼承Thread類: run()方法總體被重寫;

實現Runnable接口:最終調用 target.run()。

4、實現 Runnable 接口和繼承 Thread 類哪一種方式更好?

Runnable和Thread二者最大的區別是Thread是類而Runnable是接口,至於用類仍是用接口,取決於繼承上的實際須要。Java類是單繼承的,實現多個接口能夠實現相似多繼承的操做。

使用繼承 Thread 的方式的話,那麼每次想新建一個任務,只能新建一個獨立的線程,而這樣作的損耗會比較大。而若是採用實現Runnable接口的話,Runnable就至關於一個做業,而Thread纔是真正的處理線程,咱們須要的只是定義這個做業,而後將做業交給線程去處理,這樣就達到了鬆耦合,也符合面向對象裏面組合的使用。

5、總結

當下次再遇到這樣的面試題的時候,能夠這樣硬剛面試官:

Java官方文檔說明有兩種方式實現線程:繼承Thread和實現Runnable接口。

可是深刻源碼會發現,實際上是一種本質方式,只能經過新建Thread類來建立線程,可是類裏面的run方法有兩種方式來實現,第一種是重寫run方法,第二種實現Runnable接口的run方法,而後再把該runnable實例傳給Thread類。

原文出處:https://www.cnblogs.com/sgh1023/p/11426858.html

相關文章
相關標籤/搜索