Java多線程詳解(一)三種創建線程的方法

在這裏插入圖片描述

一、繼承Thread類

  • 自定義線程類繼承Thread類
  • 重寫run()方法,編寫線程執行體
  • 創建線程對象,調用start()方法啓動線程
  • 不建議使用:避免OOP單繼承侷限性
package ThreadTest;

//創建線程的方式一:繼承Thread類,重寫run()方法,調用start開啓線程
//線程開啓不一定立即執行,由cpu調度執行
public class TestThread extends Thread{
    @Override
    public void run() {
        // run()方法線程體
        for (int i = 0; i <10 ; i++) {
            System.out.println("子線程xxxxx");
        }
    }

    public static void main(String[] args) {
        //main線程,主線程
        //創建一個線程對象
        TestThread testThread = new TestThread();
        //調用start()方法開啓線程
        testThread.start();

        for (int i = 0; i <100 ; i++) {
            System.out.println("主線程xxxx");
        }
    }
}

運行結果:

在這裏插入圖片描述

二、實現Runnable接口

  • 定義MyRunnable類實現Runnable接口
  • 實現run()方法,編寫線程執行體
  • 創建線程對象,調用start()方法啓動線程
  • 推薦使用:避免單繼承侷限性,靈活方便,方便同一個對象被多個線程使用
package ThreadTest;

//創建線程的方式二:實現Runnable接口,重寫run方法,執行線程需要丟入runnable接口實現類,調用start方法
//線程開啓不一定立即執行,由cpu調度執行
public class TestThread implements Runnable{
    @Override
    public void run() {
        // run()方法線程體
        for (int i = 0; i <10 ; i++) {
            System.out.println("子線程xxxxx");
        }
    }

    public static void main(String[] args) {
        //創建runnable接口的實現類對象
        TestThread testThread = new TestThread();

        //創建線程對象,通過線程對象來開啓我們的線程,代理模式
        Thread thread = new Thread(testThread);

        //調用start()方法開啓線程
        thread.start();

        for (int i = 0; i <100 ; i++) {
            System.out.println("主線程xxxx");
        }
    }
}

三、實現Callable接口

  1. 實現Callable接口,需要返回值類型
  2. 重寫call方法,需要拋出異常
  3. 創建目標對象
  4. 創建執行服務
ExecutorService ser = Executors.newFixedThreadPool(1);
  1. 提交執行
Future <Boolean> result1 = ser.submit(t1); 
  1. 獲取結果
boolean r1 = result1.get();
  1. 關閉服務
ser.shutdownNow();

代碼示例:

package ThreadTest;

import java.util.concurrent.*;

//線程的創建方式三:實現callable接口
//callable的好處:可以定義線程的返回值,可以拋出異常
public class TestCallable implements Callable<Boolean> {
    @Override
    public Boolean call() throws Exception {
        for (int i = 0; i < 10; i++) {
            System.out.println("子線程xxx");
        }
        return true;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        TestCallable testCallable = new TestCallable();

        //創建執行服務
        ExecutorService ser = Executors.newFixedThreadPool(1);

        //提交執行
        Future<Boolean> r1 = ser.submit(testCallable);

        //主線程內容
        for (int i = 0; i < 100; i++) {
            System.out.println("主線程");
        }

        //獲取結果
        boolean rs1 = r1.get();

        //打印返回值
        System.out.println(rs1);

        //關閉服務
        ser.shutdownNow();

    }
}

好了,今天這篇文章就到這裏啦,Java的學習一定要多寫多練。筆者會不定期做一些技術分享和工具使用心得,歡迎大家點贊和收藏!

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章