Java實現多執行緒的三種方式

谷哥的小弟發表於2020-02-08

C語言自學完備手冊(33篇)

Android多解析度適配框架

JavaWeb核心技術系列教程

HTML5前端開發實戰系列教程

MySQL資料庫實操教程(35篇圖文版)

推翻自己和過往——自定義View系列教程(10篇)

走出思維困境,踏上精進之路——Android開發進階精華錄

講給Android程式設計師看的前端系列教程(40集免費視訊教程+原始碼)


版權宣告

  • 本文原創作者:谷哥的小弟
  • 作者部落格地址:http://blog.csdn.net/lfdfhl

概述

在Java中可通過三種方式來實現多執行緒:

  • 1、繼承Thread類,重寫run( )方法
  • 2、實現Runnable介面,重寫run( )方法
  • 3、實現Callable介面,重寫call( )方法並使用FutureTask獲取call( )方法的返回結果

利用Thread類實現多執行緒

主要步驟

  • 1、通過繼承Thread建立執行緒的子類
  • 2、重寫Thread類的run( )方法
  • 3、建立子類例項物件
  • 4、呼叫子類例項物件start( )方法啟動執行緒

使用示例

package com.thread1;
/**
 * 本文作者:谷哥的小弟 
 * 部落格地址:http://blog.csdn.net/lfdfhl
 */
public class ThreadCreate1 {

	public static void main(String[] args) {
		//建立第一個子執行緒
		MyThread firstThread=new MyThread();
		firstThread.start();
		String firstThreadName = firstThread.getName();
		System.out.println("firstThreadName="+firstThreadName);
		
		//建立第二個子執行緒
		MyThread secondThread=new MyThread();
		secondThread.start();
		String secondThreadName = secondThread.getName();
		System.out.println("secondThreadName="+secondThreadName);
	}

}

//MyThread繼承Thread類
class MyThread extends Thread{
	@Override
	public void run() {
		super.run();
		String threadName = Thread.currentThread().getName();
		for(int i=0;i<5;i++) {
			System.out.println(threadName+",i="+i);
		}
	}
}

執行結果

在這裡插入圖片描述

利用Runnable介面實現多執行緒

主要步驟

  • 1、建立Runnable介面實現類並重寫該介面的run( )方法
  • 2、建立Runnable介面實現類物件
  • 3、利用Thread有參建構函式public Thread(Runnable target)和Runnable介面實現類物件建立執行緒例項
  • 4、呼叫執行緒例項的start( )方法啟動執行緒

使用示例

package com.thread1;
/**
 * 本文作者:谷哥的小弟 
 * 部落格地址:http://blog.csdn.net/lfdfhl
 */
public class ThreadCreate2 {

	public static void main(String[] args) {
		// 建立第一個子執行緒
		MyRunnable firstMyRunnable=new MyRunnable();
		Thread firstThread = new Thread(firstMyRunnable);
		firstThread.start();
		String firstThreadName = firstThread.getName();
		System.out.println("firstThreadName=" + firstThreadName);

		// 建立第二個子執行緒
		MyRunnable secondMyRunnable=new MyRunnable();
		Thread secondThread = new Thread(secondMyRunnable);
		secondThread.start();
		String secondThreadName = secondThread.getName();
		System.out.println("secondThreadName=" + secondThreadName);
	}

}

//MyRunnable實現Runnable介面
class MyRunnable implements Runnable {
	@Override
	public void run() {
		String threadName = Thread.currentThread().getName();
		for (int i = 0; i < 5; i++) {
			System.out.println(threadName + ",i=" + i);
		}
	}

}

執行結果

在這裡插入圖片描述

利用Callable介面實現多執行緒

主要步驟

  • 1、建立Callable介面實現類並重寫該介面的call( )方法
  • 2、建立Callable介面實現類物件
  • 3、使用Runnable子類FutureTask的有參建構函式public FutureTask(Callable< V > callable)和Callable介面實現類物件建立FutureTask例項
  • 4、利用Thread有參建構函式public Thread(Runnable target)和FutureTask例項建立執行緒例項
  • 5、呼叫執行緒例項的start( )方法啟動執行緒
  • 6、利用FutureTask的get( )方法獲取子執行緒執行結果

使用示例

package com.thread1;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
 * 本文作者:谷哥的小弟 
 * 部落格地址:http://blog.csdn.net/lfdfhl
 */
public class ThreadCreate3 {

	public static void main(String[] args) throws InterruptedException, ExecutionException {
		// 建立第一個子執行緒
		MyCallable firstMyCallable = new MyCallable();
		FutureTask<Object> firstFutureTask = new FutureTask<>(firstMyCallable);
		Thread firstThread = new Thread(firstFutureTask);
		firstThread.start();
		String firstThreadName = firstThread.getName();
		System.out.println("firstThreadName=" + firstThreadName);
		// 獲取第一個子執行緒返回的結果
		Object firstThreadResult = firstFutureTask.get();
		System.out.println("firstThreadResult=" + firstThreadResult);

		// 建立第二個子執行緒
		MyCallable secondMyCallable = new MyCallable();
		FutureTask<Object> secondFutureTask = new FutureTask<>(secondMyCallable);
		Thread secondThread = new Thread(secondFutureTask);
		secondThread.start();
		String secondThreadName = secondThread.getName();
		System.out.println("secondThreadName=" + secondThreadName);
		// 獲取第二個子執行緒返回的結果
		Object secondThreadResult = secondFutureTask.get();
		System.out.println("secondThreadResult=" + secondThreadResult);
	}

}

// MyCallable實現Callable介面
class MyCallable implements Callable<Object> {
	@Override
	public Object call() throws Exception {
		String threadName = Thread.currentThread().getName();
		int i = 0;
		while (i < 5) {
			System.out.println(threadName + ",i=" + i);
			i++;
		}
		return i;
	}

}

執行結果

在這裡插入圖片描述

總結

為避免Java單繼承帶來的侷限性,在實際開發中多采用實現Runnable介面或實現Callable介面的方式實現多執行緒。

相關文章