1. 程式人生 > >java多執行緒的實現方式總結

java多執行緒的實現方式總結

	一個專案所用的技術往往是由業務所驅動的,平常我們寫的最多的是業務的CRUD,這是一個普遍的現象,要想往上提升,往往繞不開多執行緒知識,這篇文章是LZ對多執行緒實現的一些看法

多執行緒的三種實現方式

目前多執行緒的實現方式有三種,讓我帶您一一看來

繼承Thread類

這是我們比較熟悉的一種,廢話不多說,先來看看他的使用程式碼

public class ThreadTest {
    public static void main(String[] args) {
        /**
         *
         第一種,繼承Thread類
         */
        new
ThreadDemo().start(); /** } static class ThreadDemo extends Thread{ @Override public void run() { System.out.println("第一種實現方式!:繼承Thread類"); } } }

實現Runable介面

這也是我們比較熟悉的一種,以下是程式碼:

public class ThreadTest {
    public static void main(String[] args)
{ /** * 第二種,實現runable 介面 */ RunableDemo runableDemo=new RunableDemo(); new Thread(runableDemo).start(); } static class RunableDemo implements Runnable{ @Override public void run() { System.out.println("第二種實現方式!:實現Runnable介面"
); } } }

實現Callable介面

這種實現方式,可能初學者見得比較少,也是先上程式碼

public class ThreadTest {
    public static void main(String[] args) {
        /**
         *
         第三種。實現callable介面
         */
        CallableDemo callableDemo=new CallableDemo();
        FutureTask futureTask=new FutureTask(callableDemo);
        new Thread(futureTask).start();
        System.out.println(futureTask.get().toString());//得到任務返回值
    }  
    static class CallableDemo implements Callable{
        @Override
        public Object call() throws Exception {
            System.out.println("第三種實現方式!:實現Callable介面");
            return "test";;
        }
    }
}

三種實現方式直接的不同及關聯

三種實現方式的區別

第一種和第二種實現方式都是沒有返回值的,也是大家所熟知的,一個繼承類,一個實現介面,就不多說了,第三種方法返回了一個Object,這種實現方法可以應用於需要知道任務結果的場景
從程式碼中可以看到他的使用方式有點不一樣,多了FutureTask包裝Callable的步驟,然後再是用Thread類的start方法啟動,我們點進去FutureTask的原始碼看看:在這裡插入圖片描述
在這裡插入圖片描述
相信您也看到了,他最終還是實現了Runnable介面。至於FutureTask,這裡就不細講了,設計到的東西就多了,您現在只要知道get()方法可以拿到任務的返回值就行。之後會細講這些

三種實現方式的關聯

三種實現方式最終都是呼叫Thread類的start方法來啟動執行緒,來看看Thread類的原始碼
來自jdk1.8

看到了沒,Thread類也是實現了Runable介面,我們都知道多執行緒是用來做非同步任務的,從程式碼中可以看出run方法是具體做的事情(任務),而Thread類是裝非同步任務的一個容器,start()方法是這個容器啟動任務run()方法的鑰匙
總結下多執行緒啟動的底層(原始碼層)必要條件:

	1、Thread容器(裝任務)
	2、實現Runable介面(任務)
	3、呼叫Thread.start()(啟動任務容器)

之後講的執行緒池雖然看上去,沒有了這些步驟,實際上是將他們封裝到了底層了,這個之後再講。

lz有話說

這篇文章是樓主在一個週末心血來潮下筆的,第一次寫技術文章,才知道原創作者的不容易 ,lz才疏學淺,肯定有很多地方沒有注意到,如有大牛看到,望您不吝賜教