1. 程式人生 > >建立JAVA執行緒的三種主要方式

建立JAVA執行緒的三種主要方式

程式 程序 執行緒

程式: 一組計算機指令有序的集合
程序: 具有一定功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。
執行緒: 執行緒是程序的實體,是cpu分派和排程的基本單位,它是比程序更小的能獨立執行的基本單位。執行緒自己基本上不擁有系統資源,值擁有一點在執行時必不可少的資源(程式計數器 一組暫存器和棧);但他可以和同屬程序的其他執行緒共享程序的所有資源。

1. 擴充套件(即繼承)java.lang.Thread類

/**
 * @author FengTianHao
 * @version 1.0
 * @since 2018/11/15 17:04
 */

/**
 *  此種實現java執行緒的方式中,run()方法中的程式碼是執行緒要執行的程式碼段,無返回值
 *
 *  啟動執行緒是在Thread物件上呼叫start()方法
 */
public class TestThread extends Thread{
    @Override//重寫父類的run()方法
    public void run()//該方法裡面的程式碼段是執行緒要執行的程式碼段
    {
        System.out.println("TestThread.run");
    }
    public static void main(String[] args)
    {
        TestThread thread=new TestThread();//建立執行緒
        thread.start();//啟動執行緒
    }
}

2.實現java.lang.Runable介面

/**
 * @author FengTianHao
 * @version 1.0
 * @since 2018/11/15 17:04
 */

/**
 * 如果採用實現Runnable來實現執行緒需要呼叫Thread構造方法
 * Thread(Runnable target)
 * Thread(Runnable target, String name)
 * Thread(ThreadGroup group, Runnable target)
 * Thread(ThreadGroup group, Runnable target, String name)
 * Thread(ThreadGroup group, Runnable target, String name, long stackSize)
 */

public class TestThread implements Runnable{
    private String name;//可以給執行緒起名字
    public TestThread(String name)
    {
        this.name=name;
    }
    @Override
    public void run() {
        for(int i=0;i<100;i++)
        {
            System.out.println(name+i);
        }
    }
    public static void main(String[] args)throws  Exception
    {
        TestThread thread=new TestThread("fth");
        Thread t1=new Thread(thread);
        t1.start();
    }
}

3.使用callable和future建立執行緒

/**
 * @author FengTianHao
 * @version 1.0
 * @since 2018/11/15 17:04
 */

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/** 從javajdk5開始,java提供Callable介面,該介面提供一個方法call()
 *  該方法作為執行緒執行體
 *  該方法可以有返回值,還可以丟擲異常
 *  java jdk5提供了Future介面來代表call方法的返回值
 *  並提供了Future介面的實現類FutureTask
 *  FutureTask類實現了Future的介面,也實現了Runnable的介面
 */

public class TestThread implements Callable<Integer> {
    //建立Callable介面的實現類,並實現call方法

    int i=0;
    @Override
    public Integer call() throws Exception {

        for(;i<10;i++){}
        return i;
    }
    public static void main(String[] args)
    {
        TestThread thread=new TestThread();
        FutureTask<Integer> ft=new FutureTask<>(thread);//使用FutureTask類封裝Callable物件的call方法的返回值
        Thread td=new Thread(ft);//使用FutureTask物件作為Thread的target建立執行緒
        td.start();//啟動執行緒
        try {
            System.out.println(ft.get());//通過FutureTask中的get方法獲得執行緒執行完後的返回值
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

}

結論

採用Runnable和Callable的優勢:執行緒類在實現Runnable介面或者Callable介面的情況下還可以繼承其他類,這可以使多個執行緒共享一個target物件,因此適合多個執行緒處理同一份資源。一般推薦通過實現介面來建立多執行緒。