1. 程式人生 > >Java8多執行緒的啟動方法

Java8多執行緒的啟動方法

一、程序與執行緒的區別
總:作業系統執行多工,每個任務就是程序;程序執行多工,每個任務就是執行緒;包含關係
分:
1.排程性:在引入執行緒的OS中,把執行緒作為排程和分派的基本單位,把程序作為資源擁有的基本單位
2.併發性:在引入執行緒的OS中,不僅程序間可以併發執行,一個程序的多個執行緒之間也可以併發執行
3.擁有資源:程序是擁有資源的基本單位,執行緒除了擁有一點執行中必不可少的資源(執行緒控制塊,程式計數器,一組暫存器值和堆疊)外,本身基本沒有系統資源,但是可以訪問程序的資源。
4.建立或撤銷程序時系統都要為它分配或回收資源,程序切換所要保留的現場資訊也多於執行緒。由於一個程序的執行緒間共享同一地址空間和開啟檔案,因此它們的同步與通訊更加容易。
二、多執行緒的啟動方法
1、繼承Thread:重寫run()方法,呼叫start()啟動執行緒

public class TestThread extends Thread
{
    @Override
    public void run()
    {
        //寫入具體方法
        //getName()是例項方法,返回當前執行緒名
        System.out.println(getName());  
        //currentThread()是類方法,返回正在執行的執行緒物件
        Thread.currentThread();         
    }
    public static void main()
    {
        TestThread thread = new
TestThread(); thread.start(); } }

2、實現Runnable介面建立執行緒類

public class TestRunnable implements Runnable
{
    public void run()
    {
        //寫入具體方法
    }
    public static void main()
    {
        //1.以介面實現物件和執行緒名作為建構函式的引數
        TestRunnable runnable = new TestRunnable();
        Thread thread1 = new
Thread(runnable,"thread1"); thread1.start(); //2.Lambda表示式建立執行緒 Thread thread2 = new Thread(()->{ //寫入具體方法 },"thread2"); thread2.start(); //3.匿名類建立執行緒 Thread thread3 = new Thread(new Runnable() { @Override public void run() { //寫入具體方法 } },"thread3"); thread3.start(); } }

Tip:設定Android Studio支援Lambda表示式的方法
http://blog.csdn.net/nicolelili1/article/details/52275263
3、使用Callable和Future建立執行緒
用法與Runnable大同小異,Callable介面提供call()方法,支援返回值並可以丟擲異常;Future介面代表Callable接口裡call()的返回值。Lambda表示式方法不再舉例

public class TestCallableFuture
{
    public static void main()
    {
        FutureTask<Integer> task = new FutureTask<Integer>(
            new Callable<Integer>()
            {
                @Override
                public Integer call() throws Exception
                {
                    return null;
                }
            }
        );
        new Thread(task,"有返回值的執行緒").start();
        try
        {
            /**
             * get方法獲取call()的返回值,該方法造成程式阻塞,等子執行緒執行結束獲得返回值
             * 可以傳入等待時間(時長,時間單位),超出時間丟擲TimeoutException異常
             */
            System.out.println(task.get().toString());
            System.out.println(task.get(1000,TimeUnit.MILLISECONDS).toString());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

4.小結:使用2、3方法可以使多個執行緒共享一個target物件,推薦