java創建線程的幾種方式


1.通過實現Runnable接口創建線程

package com.javaBase.LineDistance;

/**
 * 〈一句話功能簡述〉;
 * 〈功能詳細描述〉
 *
 * @author jxx
 * @see [相關類/方法](可選)
 * @since [產品/模塊版本] (可選)
 */
public class testRunn implements Runnable {


    @Override
    public void run() {
        System.out.println("123");
    }
}
package com.javaBase.LineDistance;

/**
 * 〈一句話功能簡述〉;
 * 〈多線程測試代碼〉
 *
 * @author jxx
 * @see [相關類/方法](可選)
 * @since [產品/模塊版本] (可選)
 */
public class testLine {

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

2.通過實現callable接口創建線程

package com.javaBase.LineDistance;

import java.util.concurrent.Callable;

/**
 * 〈一句話功能簡述〉;
 * 〈功能詳細描述〉
 *
 * @author jxx
 * @see [相關類/方法](可選)
 * @since [產品/模塊版本] (可選)
 */
public class TestCallable implements Callable {

    @Override
    public Object call() throws Exception {
        System.out.println("123");
        return "1";
    }
}
package com.javaBase.LineDistance;

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

/**
 * 〈一句話功能簡述〉;
 * 〈多線程測試代碼〉
 *
 * @author jxx
 * @see [相關類/方法](可選)
 * @since [產品/模塊版本] (可選)
 */
public class testLine {

    public static void main(String[] args){
        Callable call = new TestCallable();
        FutureTask future = new FutureTask(call);
        Thread t2 = new Thread(new testRunn());
        t2.start();
    }
}

3.通過集成Thread類創建線程

package com.javaBase.LineDistance;

/**
 * 〈一句話功能簡述〉;
 * 〈功能詳細描述〉
 *
 * @author jxx
 * @see [相關類/方法](可選)
 * @since [產品/模塊版本] (可選)
 */
public class TestThread extends Thread {

    @Override
    public void run() {
        System.out.println("123");
    }

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

4.使用Executor框架來創建線程池

  在Java 5之后,並發編程引入了一堆新的啟動、調度和管理線程的API。Executor框架便是Java 5中引入的,其內部使用了線程池機制,它在java.util.cocurrent 包下,通過該框架來控制線程的啟動、執行和關閉,可以簡化並發編程的操作。因此,在Java 5之后,通過Executor來啟動線程比使用Thread的start方法更好,除了更易管理,效率更好(用線程池實現,節約開銷)外,還有關鍵的一點:有助於避免this逃逸問題——如果我們在構造器中啟動一個線程,因為另一個任務可能會在構造器結束之前開始執行,此時可能會訪問到初始化了一半的對象用Executor在構造器中。

package com.javaBase.LineDistance;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 〈一句話功能簡述〉;
 * 〈功能詳細描述〉
 *
 * @author jxx
 * @see [相關類/方法](可選)
 * @since [產品/模塊版本] (可選)
 */
public class TestExcetor {

    public static void main(String[] args){
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(new testRunn());
        executorService.shutdown();
    }
}

Executor框架后面再詳解。

5.Runnable和Callable的區別

  • Callable規定的方法是call(),Runnable規定的方法是run()
  • Callable的任務執行后可返回值,而Runnable的任務是不能返回值得
  • call方法可以拋出異常,run方法不可以
  • 運行Callable任務可以拿到一個Future對象,表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果。通過Future對象可以了解任務執行情況,可取消任務的執行,還可獲取執行結果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM