日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程的四种实现方式

發布時間:2024/3/26 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程的四种实现方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.繼承Thread類,重寫run方法

2.實現Runnable接口,重寫run方法

3.通過Callable和ExecutorService創建線程

4.通過線程池創建線程

前面兩種可以歸結為一類:無返回值(通過重寫run方法,run方式的返回值是void,所以沒有辦法返回結果)
后面兩種可以歸結成一類:有返回值,通過Callable接口,就要實現call方法,這個方法的返回值是Object,所以返回的結果可以放在Object對象中

第一種:繼承Thread類,重寫run方法

public class Test1 extends Thread{public Test1(){//編寫子類的構造方法}public void run(){// System.out.println(111);//編寫自己的線程代碼//Thread.currentThread表示當前代碼段正在被哪個線程調用的相關信息System.out.println(Thread.currentThread().getName());}public static void main(String[] args) {Test1 test1 = new Test1();test1.setName("我是線程1");test1.start();System.out.println(Thread.currentThread().toString());}}

運行結果:

Thread[main,5,main] 我是線程1

第二種:實現Runnable接口,重寫run方法

public class Test2 {public static void main(String[] args) {System.out.println(Thread.currentThread().getName());Thread t1 = new Thread(new MyThread());t1.start();} } class MyThread implements Runnable{public void run() {System.out.println(Thread.currentThread().getName()+"->我是線程2");} }

運行結果:

main Thread-0->我是線程2

第三種:通過Callable和ExecutorService創建線程

public class Test3 {public static void main(String[] args) {Callable<Object> oneCallable = new Tickets<Object>();FutureTask<Object> oneTask=new FutureTask<Object>(oneCallable);Thread t = new Thread(oneTask);System.out.println(Thread.currentThread().getName());t.start();} } class Tickets<Object> implements Callable<Object>{public Object call() throws Exception {System.out.println(Thread.currentThread().getName()+"我是線程3");return null;} }

運行結果:

main Thread-0我是線程3

第四種:通過線程池創建線程

public class Test4 {private static int POOL_NUM=10;public static void main(String[] args) throws InterruptedException {//線程池的數量ExecutorService executorService = Executors.newFixedThreadPool(5);for(int i=0;i<POOL_NUM;i++){RunnableThread thread = new RunnableThread();executorService.execute(thread);}//關閉線程池executorService.shutdown();} }class RunnableThread implements Runnable{public void run() {System.out.println("我是線程4:"+Thread.currentThread().getName());} }

運行結果:

我是線程4:pool-1-thread-2 我是線程4:pool-1-thread-5 我是線程4:pool-1-thread-4 我是線程4:pool-1-thread-3 我是線程4:pool-1-thread-1 我是線程4:pool-1-thread-5 我是線程4:pool-1-thread-4 我是線程4:pool-1-thread-2 我是線程4:pool-1-thread-1 我是線程4:pool-1-thread-3

Executors類:提供了一系列工廠方法用于創建線程池,返回的線程池都實現了ExecutorService接口。

public static ExecutorService newFixedThreadPool(int nThreads)
創建固定數目線程的線程池。
public static ExecutorService newCachedThreadPool()
創建一個可緩存的線程池,調用execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程并添加到池中。終止并從緩存中移除那些已有 60 秒鐘未被使用的線程。
public static ExecutorService newSingleThreadExecutor()
創建一個單線程化的Executor。
public static ScheduledExecutorService newScheduledThreadPool(int
corePoolSize)
創建一個支持定時及周期性的任務執行的線程池,多數情況下可用來替代Timer類。
ExecutoreService提供了submit()方法,傳遞一個Callable,或Runnable,返回Future。如果Executor后臺線程池還沒有完成Callable的計算,這調用返回Future對象的get()方法,會阻塞直到計算完成。

二、Thread 和Runnable 的區別和聯系

Thread其實本身就是實現了接口 Runnable的一個類;Thread類也是Runnable接口的子類。

因此 Thread中的方法和成員變量要比Runnable多,最典型地就是 Thread有start()方法,但是Runnable接口沒有start()方法;

實際開發中我們通常采用Runnable接口來實現多線程。實現Runnable接口比繼承Thread類有如下好處:?
1. 避免繼承的局限,一個類可以繼承多個接口,但是類只能繼承一個類。?
2. Runnable接口實現的線程便于資源共享。而通過Thread類實現,各自線程的資源是獨立的,不方便共享。?

總結

以上是生活随笔為你收集整理的多线程的四种实现方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。