首頁 > Java > Java基礎 > 主體

java多執行緒如何實現

發布: 2019-12-04 11:06:59
原創
3745 人瀏覽過

java多執行緒如何實現

java實作多執行緒的方法:(推薦:java影片教學

方式一:繼承Thread類別的方式

1、建立一個繼承於Thread類別的子類別

2、重寫Thread類別中的run():將此執行緒要執行的操作宣告在run()

3、建立Thread的子類別的物件

4、呼叫此物件的start():①啟動執行緒②呼叫目前執行緒的run()方法

方式二:實作Runnable介面的方式

1、建立實作Runnable介面的類別

2、實作Runnable介面中的抽象方法:run():將會建立的執行緒要執行的操作宣告在此方法中

3、建立Runnable介面實作類別的物件

4、將此物件作為參數傳遞到Thread類別的建構器中,建立Thread類的物件

5、呼叫Thread類別中的start():① 啟動執行緒  ② 呼叫執行緒的run() --->呼叫Runnable介面實作類別的run()

以下兩種方式是jdk1.5新增的!

方式三:實作Callable介面

說明:

1、與使用Runnable相比, Callable功能更強大些

2、實作的call()方法比較run()方法,可以傳回值

3、方法可以拋出例外

4、支援泛型的回傳值

5、需要藉助FutureTask類,例如取得回傳結果

Future介面可以對特定Runnable、Callable任務的執行結果進行取消、查詢是否完成、取得結果等。 FutureTask是Futrue介面的唯一的實作類別FutureTask 同時實作了Runnable, Future介面。它既可以當作Runnable被執行緒執行,又可以作為Future得到Callable的回傳值

#方式四:使用執行緒池

##說明:

事先創建好多個線程,放入線程池中,使用時直接獲取,使用完放回池中。可以避免頻繁創造銷毀、實現重複利用。類似生活中的大眾運輸工具。

好處:

1、提高回應速度(減少了創建新線程的時間)

2、降低資源消耗(重複利用線程池中線程,不需要每次都創建)

3、便於線程管理

範例:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ThreadPoolExecutor;

//方式一
class ThreadTest extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}
	}
}

// 方式二
class RunnableTest implements Runnable {
	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}
	}
}

// 方式三
class CallableTest implements Callable<Integer> {

	@Override
	public Integer call() throws Exception {
		int sum = 0;
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName() + ":" + i);
			sum += i;
		}
		return sum;
	}

}

// 方式四
class ThreadPool implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}
	}

}

public class Test {
	public static void main(String[] args) {
		// 继承Thread
		ThreadTest thread = new ThreadTest();
		thread.setName("方式一");
		thread.start();

		// 实现Runnable
		RunnableTest runnableTest = new RunnableTest();
		Thread thread2 = new Thread(runnableTest, "方式二");
		thread2.start();

		// 实现Callable<> 有返回值
		CallableTest callableTest = new CallableTest();
		FutureTask<Integer> futureTask = new FutureTask<>(callableTest);
		new Thread(futureTask, "方式三").start();
		// 返回值
		try {
			Integer integer = futureTask.get();
			System.out.println("返回值(sum):" + integer);
		} catch (Exception e) {
			e.printStackTrace();
		}

		// 线程池
		ExecutorService pool = Executors.newFixedThreadPool(10);

		ThreadPoolExecutor executor = (ThreadPoolExecutor) pool;
		/*
		 * 可以做一些操作:
		 * corePoolSize:核心池的大小 
		 * maximumPoolSize:最大线程数
		 * keepAliveTime:线程没任务时最多保持多长时间后会终止
		 */
		executor.setCorePoolSize(5);

		// 开启线程
		executor.execute(new ThreadPool());
		executor.execute(new ThreadPool());
		executor.execute(new ThreadPool());
		executor.execute(new ThreadPool());

	}

}
登入後複製

更多java知識請關注

java基礎教學欄位。

以上是java多執行緒如何實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!