国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java 多線程實(shí)現(xiàn)的三種方式

這篇具有很好參考價(jià)值的文章主要介紹了Java 多線程實(shí)現(xiàn)的三種方式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Java 多線程實(shí)現(xiàn)的三種方式

Java 多線程實(shí)現(xiàn)方式主要有三種:繼承 Thread 類、實(shí)現(xiàn) Runnable 接口、使用 ExecutorService、Callable、Future 實(shí)現(xiàn)有返回結(jié)果的多線程。其中前兩種方式線程執(zhí)行完后都沒(méi)有返回值,只有最后一種是帶返回值的。

1、繼承 Thread 類實(shí)現(xiàn)多線程

繼承 Thread 類的方法盡管被我列為一種多線程實(shí)現(xiàn)方式,但 Thread 本質(zhì)上也是實(shí)現(xiàn)了 Runnable 接口的一個(gè)實(shí)例,它代表一個(gè)線程的實(shí)例,并且,啟動(dòng)線程的唯一方法就是通過(guò) Thread 類的 start () 實(shí)例方法。start () 方法是一個(gè) native 方法,它將啟動(dòng)一個(gè)新線程,并執(zhí)行 run () 方法。這種方式實(shí)現(xiàn)多線程很簡(jiǎn)單,通過(guò)自己的類直接 extend Thread,并復(fù)寫(xiě) run () 方法,就可以啟動(dòng)新線程并執(zhí)行自己定義的 run () 方法。例如:

1 public class MyThread extends Thread { 
2   public void run() { 
3    System.out.println("MyThread.run()"); 
4   } 
5 }

在合適的地方啟動(dòng)線程如下:

MyThread myThread1 = new MyThread(); 
MyThread myThread2 = new MyThread(); 
myThread1.start(); 
myThread2.start();

2、實(shí)現(xiàn) Runnable 接口方式實(shí)現(xiàn)多線程

如果自己的類已經(jīng) extends 另一個(gè)類,就無(wú)法直接 extends Thread,此時(shí),必須實(shí)現(xiàn)一個(gè) Runnable 接口,如下:

public class MyThread extends OtherClass implements Runnable { 
  public void run() { 
   System.out.println("MyThread.run()"); 
  } 
}

為了啟動(dòng) MyThread,需要首先實(shí)例化一個(gè) Thread,并傳入自己的 MyThread 實(shí)例:

MyThread myThread = new MyThread(); 
Thread thread = new Thread(myThread); 
thread.start();

事實(shí)上,當(dāng)傳入一個(gè) Runnable target 參數(shù)給 Thread 后,Thread 的 run () 方法就會(huì)調(diào)用 target.run (),參考 JDK 源代碼:

public void run() { 
  if (target != null) { 
   target.run(); 
  } 
}

3、使用 ExecutorService、Callable、Future 實(shí)現(xiàn)有返回結(jié)果的多線程

ExecutorService、Callable、Future 這個(gè)對(duì)象實(shí)際上都是屬于 Executor 框架中的功能類。想要詳細(xì)了解 Executor 框架的可以訪問(wèn) http://www.javaeye.com/topic/366591 ,這里面對(duì)該框架做了很詳細(xì)的解釋。返回結(jié)果的線程是在 JDK1.5 中引入的新特征,確實(shí)很實(shí)用,有了這種特征我就不需要再為了得到返回值而大費(fèi)周折了,而且即便實(shí)現(xiàn)了也可能漏洞百出。

可返回值的任務(wù)必須實(shí)現(xiàn) Callable 接口,類似的,無(wú)返回值的任務(wù)必須 Runnable 接口。執(zhí)行 Callable 任務(wù)后,可以獲取一個(gè) Future 的對(duì)象,在該對(duì)象上調(diào)用 get 就可以獲取到 Callable 任務(wù)返回的 Object 了,再結(jié)合線程池接口 ExecutorService 就可以實(shí)現(xiàn)傳說(shuō)中有返回結(jié)果的多線程了。下面提供了一個(gè)完整的有返回結(jié)果的多線程測(cè)試?yán)?,?JDK1.5 下驗(yàn)證過(guò)沒(méi)問(wèn)題可以直接使用。代碼如下:

import java.util.concurrent.*; 
import java.util.Date; 
import java.util.List; 
import java.util.ArrayList; 
  
/**
* 有返回值的線程
*/ 
@SuppressWarnings("unchecked") 
public class Test { 
public static void main(String[] args) throws ExecutionException, 
   InterruptedException { 
  System.out.println("----程序開(kāi)始運(yùn)行----"); 
  Date date1 = new Date(); 
  
  int taskSize = 5; 
  // 創(chuàng)建一個(gè)線程池 
  ExecutorService pool = Executors.newFixedThreadPool(taskSize); 
  // 創(chuàng)建多個(gè)有返回值的任務(wù) 
  List<Future> list = new ArrayList<Future>(); 
  for (int i = 0; i < taskSize; i++) { 
   Callable c = new MyCallable(i + " "); 
   // 執(zhí)行任務(wù)并獲取Future對(duì)象 
   Future f = pool.submit(c); 
   // System.out.println(">>>" + f.get().toString()); 
   list.add(f); 
  } 
  // 關(guān)閉線程池 
  pool.shutdown(); 
  
  // 獲取所有并發(fā)任務(wù)的運(yùn)行結(jié)果 
  for (Future f : list) { 
   // 從Future對(duì)象上獲取任務(wù)的返回值,并輸出到控制臺(tái) 
   System.out.println(">>>" + f.get().toString()); 
  } 
  
  Date date2 = new Date(); 
  System.out.println("----程序結(jié)束運(yùn)行----,程序運(yùn)行時(shí)間【" 
    + (date2.getTime() - date1.getTime()) + "毫秒】"); 
} 
} 
  
class MyCallable implements Callable<Object> { 
private String taskNum; 
  
MyCallable(String taskNum) { 
  this.taskNum = taskNum; 
} 
  
public Object call() throws Exception { 
  System.out.println(">>>" + taskNum + "任務(wù)啟動(dòng)"); 
  Date dateTmp1 = new Date(); 
  Thread.sleep(1000); 
  Date dateTmp2 = new Date(); 
  long time = dateTmp2.getTime() - dateTmp1.getTime(); 
  System.out.println(">>>" + taskNum + "任務(wù)終止"); 
  return taskNum + "任務(wù)返回運(yùn)行結(jié)果,當(dāng)前任務(wù)時(shí)間【" + time + "毫秒】"; 
} 
}

代碼說(shuō)明:

上述代碼中 Executors 類,提供了一系列工廠方法用于創(chuàng)先線程池,返回的線程池都實(shí)現(xiàn)了 ExecutorService 接口。

public static ExecutorService newFixedThreadPool (int nThreads) 創(chuàng)建固定數(shù)目線程的線程池。

public static ExecutorService newCachedThreadPool () 創(chuàng)建一個(gè)可緩存的線程池,調(diào)用 execute 將重用以前構(gòu)造的線程(如果線程可用)。如果現(xiàn)有線程沒(méi)有可用的,則創(chuàng)建一個(gè)新線程并添加到池中。終止并從緩存中移除那些已有 60 秒鐘未被使用的線程。

public static ExecutorService newSingleThreadExecutor () 創(chuàng)建一個(gè)單線程化的 Executor。

public static ScheduledExecutorService newScheduledThreadPool (int corePoolSize) 創(chuàng)建一個(gè)支持定時(shí)及周期性的任務(wù)執(zhí)行的線程池,多數(shù)情況下可用來(lái)替代 Timer 類。

ExecutoreService 提供了 submit () 方法,傳遞一個(gè) Callable,或 Runnable,返回 Future。如果 Executor 后臺(tái)線程池還沒(méi)有完成 Callable 的計(jì)算,這調(diào)用返回 Future 對(duì)象的 get () 方法,會(huì)阻塞直到計(jì)算完成。

IDEA 保姆級(jí)安裝教程:??http://note.youdao.com/s/Wq2GSETJ??。

計(jì)算機(jī)專業(yè)常用畢業(yè)設(shè)計(jì)集合:??http://note.youdao.com/s/PIJHOqnk??文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-426497.html

到了這里,關(guān)于Java 多線程實(shí)現(xiàn)的三種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 線程創(chuàng)建的三種方式

    線程創(chuàng)建的三種方式

    目錄 1.?Thread類 2.?Runnable接口 3. Callable接口 4. 線程的生命周期 新建? 就緒 運(yùn)行 阻塞 等待 結(jié)束 繼承Thread類的方式創(chuàng)建線程 定義Thread類的子類,并重寫(xiě)該類的run()方法,該run()方法的方法體就代表了線程需要完成的任務(wù) 創(chuàng)建Thread類的子類,即創(chuàng)建了線程對(duì)象 調(diào)用線程對(duì)象的

    2024年02月09日
    瀏覽(28)
  • C++創(chuàng)建線程的三種方式

    早期的C++并不支持多線程的創(chuàng)建,如果要?jiǎng)?chuàng)建多線程,依賴的是系統(tǒng)提供的一些方法(例如linux的 pthread). 從C++11以后開(kāi)始,提供了std::thread線程庫(kù),因此我們可以創(chuàng)建std::thread類對(duì)象的方式來(lái)創(chuàng)建線程。創(chuàng)建的方式主要有三種: 通過(guò)函數(shù)指針 通過(guò)函數(shù)對(duì)象 通過(guò)lambda函數(shù) 使用

    2024年02月16日
    瀏覽(21)
  • Springboot中使用線程池的三種方式

    前言 多線程是每個(gè)程序員的噩夢(mèng),用得好可以提升效率很爽,用得不好就是埋汰的火葬場(chǎng)。 這里不深入介紹,主要是講解一些標(biāo)準(zhǔn)用法,熟讀唐詩(shī)三百首,不會(huì)作詩(shī)也會(huì)吟。 這里就介紹一下springboot中的多線程的使用,使用線程連接池去異步執(zhí)行業(yè)務(wù)方法。 由于代碼中包含詳

    2024年02月08日
    瀏覽(24)
  • Java 創(chuàng)建多線程的三種方法

    Java 創(chuàng)建多線程的三種方法

    在Java中創(chuàng)建多線程,往往都要通過(guò)Thread類來(lái)實(shí)現(xiàn),今天學(xué)習(xí)下Java中創(chuàng)建多線程的三種方法[1]。 通過(guò)繼承 Thread類 實(shí)現(xiàn)多線程。 主要方法: 1.void run(), 線程開(kāi)啟后,方法將被調(diào)用執(zhí)行 2.void start(), 使此線程開(kāi)始執(zhí)行, Java虛擬機(jī)會(huì)調(diào)用run()方法 實(shí)現(xiàn)步驟: 1.定義類,繼承 Thread類

    2024年02月05日
    瀏覽(21)
  • Java數(shù)組的三種聲明方式

    1.在開(kāi)發(fā)中為什么要使用數(shù)組 如果開(kāi)發(fā)中出現(xiàn)了大量的同一個(gè)類型的數(shù)據(jù),按照現(xiàn)在所學(xué)的知識(shí)點(diǎn),聲明變量的話。如果一個(gè)變量存一個(gè)數(shù)據(jù)的話,那么就會(huì)需要多個(gè)變量了,相當(dāng)麻煩。 使用數(shù)組: 只需要一個(gè)變量,然后數(shù)組中存很多的數(shù)據(jù), 其實(shí)可以把數(shù)組想成 一個(gè)容器

    2024年02月05日
    瀏覽(28)
  • Java創(chuàng)建文件的三種方式

    Java創(chuàng)建文件的三種方式

    內(nèi)容來(lái)自于韓順平學(xué)Java 在學(xué)習(xí)其視頻下跟著編寫(xiě) 文件創(chuàng)建成功

    2024年04月11日
    瀏覽(22)
  • Java創(chuàng)建數(shù)組的三種方式

    這種一般用的比較多。 數(shù)組類型 [ ]? 數(shù)組名稱? =? new 數(shù)組類型 [ 數(shù)組長(zhǎng)度 ]?

    2024年02月03日
    瀏覽(26)
  • Appium/Selenium+Java的三種等待方式

    參考: java-selenium三種等待方式 Selenium+Java(六)Selenium 強(qiáng)制等待、顯式等待、隱實(shí)等待 強(qiáng)制等待是利用time模塊的sleep方法來(lái)實(shí)現(xiàn),最簡(jiǎn)單粗暴的等待方法。 缺點(diǎn):不能準(zhǔn)確把握需要等待的時(shí)間(有時(shí)候操作未完成,等待就結(jié)束了,導(dǎo)致報(bào)錯(cuò);有時(shí)候操作已經(jīng)完成了,但時(shí)間

    2024年02月05日
    瀏覽(21)
  • java對(duì)接第三方接口的三種方式

    在日常工作中,經(jīng)常需要跟第三方系統(tǒng)對(duì)接,我們做為客戶端,調(diào)用他們的接口進(jìn)行業(yè)務(wù)處理,常用的幾種調(diào)用方式有: 1.原生的Java.net.HttpURLConnection(jdk); 2.再次封裝的HttpClient、CloseableHttpClient(Apache); 3.Spring提供的RestTemplate; 當(dāng)然還有其他工具類進(jìn)行封裝的接口,比

    2024年04月28日
    瀏覽(26)
  • 前端單點(diǎn)登錄實(shí)現(xiàn)的三種方式

    1.同源不跨域 使用document.cookie或者localStorage可以直接存取 2.跨域主域名相同 可以使用cookie-js插件存儲(chǔ)cookie,在設(shè)置cookie是添加domain參數(shù),例如 Cookies.set(\\\'token\\\', 值, { expires: 60, path: \\\'\\\', domain: \\\'taobao.com\\\' }) 只有主域名相同,瀏覽器在訪問(wèn)時(shí)才會(huì)攜帶對(duì)應(yīng)的 cookie 3.跨域 使用iframe內(nèi)嵌

    2024年04月27日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包