Java線程及其實現方式

一、線程&多線程

線程:

線程是進程的一個實體,是 CPU 調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程 自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是 它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。

多線程:

多線程指在單個程序中可以同時運行多個不同的線程執行不同的任務。

多線程編程的目的,就是「最大限度地利用 cpu 資源」,當某一線程的處理不需要佔用 cpu 而只和 io 等資源 打交道時,讓需要佔用 Cpu 的其他線程有其他機會獲得 cpu 資源。從根本上說,這就是多線程編程的最終 目的。

二、線程實現的方式

  • Thread
  • Runnable
  • Callable

Thread:

繼承Thread類並重寫run方法。其實Thread是實現Runnable接口來實現線程,class Thread implements Runnable {

public class Test {      public static void main(String[] args) {          Thread01 thread01 = new Thread01();          thread01.start();      }  }  class Thread01 extends Thread {      @Override      public void run() {          System.out.println("線程01執行了。。。");      }  }  

Runnable:

實現Runnable並實現run方法,將Runnable放入到Thread中start即可。

public class Test {      public static void main(String[] args) {          Thread thread = new Thread(new Runnable01());          thread.start();      }  }    class Runnable01 implements Runnable{      public void run() {          System.out.println("Runnable01 running....");      }  }  

第一種方法通過覆蓋Thread中的run方法來實現線程,第二種方法中,通過源碼可以發現,Thread中run方法的代碼為:

public void run() {      if (target != null) {          target.run();      }  }  

傳入的Runnable就是target,所以當我們執行Thread.start()的時候,其實是執行的Runnable的run方法。

Callable:

實現Callable重寫call方法,實現Callable和實現Runnable類似,但是功能更強大,具體表現在:

  1. 可以在任務結束後提供一個返回值,Runnable不行
  2. call方法可以拋出異常,Runnable的run方法不行
  3. 可以通過運行Callable得到的Fulture對象監聽目標線程調用call方法的結果,得到返回值,(fulture.get(),調用後會阻塞,直到獲取到返回值)
public class Test {      public static void main(String[] args) throws Exception {          System.out.println("main的線程:" + Thread.currentThread().getName());          Callable01 callable01 = new Callable01();          FutureTask<Integer> ft = new FutureTask<Integer>(callable01);          Thread thread = new Thread(ft);          thread.start();          System.out.println(ft.get()); //獲得線程執行返回結果      }  }  class Callable01 implements Callable<Integer> {      public Integer call() throws Exception {          System.out.println("Callable01的線程:" + Thread.currentThread().getName());          return 111;      }  }  

將Fulture放入Thread,能想到Fulture應該也實現了Runnable接口:

image-20200407221241071