溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java 程序中的多線程原理及用法

發(fā)布時(shí)間:2021-07-09 17:33:17 來(lái)源:億速云 閱讀:172 作者:chen 欄目:編程語(yǔ)言

這篇文章主要講解了“Java 程序中的多線程原理及用法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java 程序中的多線程原理及用法”吧!



  為什么會(huì)排隊(duì)等待?

  下面的這個(gè)簡(jiǎn)單的 Java 程序完成四項(xiàng)不相關(guān)的任務(wù)。這樣的程序有單個(gè)控制線程,控制在這四個(gè)任務(wù)之間線性地移動(dòng)。此外,因?yàn)樗璧馁Y源 — 打印機(jī)、磁盤(pán)、數(shù)據(jù)庫(kù)和顯示屏 -- 由于硬件和軟件的限制都有內(nèi)在的潛伏時(shí)間,所以每項(xiàng)任務(wù)都包含明顯的等待時(shí)間。因此,程序在訪問(wèn)數(shù)據(jù)庫(kù)之前必須等待打印機(jī)完成打印文件的任務(wù),等等。如果您正在等待程序的完成,則這是對(duì)計(jì)算資源和您的時(shí)間的一種拙劣使用。改進(jìn)此程序的一種方法是使它成為多線程的。

  四項(xiàng)不相關(guān)的任務(wù)

  class myclass {
  static public void main(String args[]) {
   print_a_file();
   manipulate_another_file();
   access_database();
   draw_picture_on_screen();
   }
  }

  在本例中,每項(xiàng)任務(wù)在開(kāi)始之前必須等待前一項(xiàng)任務(wù)完成,即使所涉及的任務(wù)毫不相關(guān)也是這樣。但是,在現(xiàn)實(shí)生活中,我們經(jīng)常使用多線程模型。我們?cè)谔幚砟承┤蝿?wù)的同時(shí)也可以讓孩子、配偶和父母完成別的任務(wù)。例如,我在寫(xiě)信的同時(shí)可能打發(fā)我的兒子去郵局買(mǎi)郵票。用軟件術(shù)語(yǔ)來(lái)說(shuō),這稱為多個(gè)控制(或執(zhí)行)線程。

  可以用兩種不同的方法來(lái)獲得多個(gè)控制線程:

  ☆ 多個(gè)進(jìn)程
  在大多數(shù)操作系統(tǒng)中都可以創(chuàng)建多個(gè)進(jìn)程。當(dāng)一個(gè)程序啟動(dòng)時(shí),它可以為即將開(kāi)始的每項(xiàng)任務(wù)創(chuàng)建一個(gè)進(jìn)程,并允許它們同時(shí)運(yùn)行。當(dāng)一個(gè)程序因等待網(wǎng)絡(luò)訪問(wèn)或用戶輸入而被阻塞時(shí),另一個(gè)程序還可以運(yùn)行,這樣就增加了資源利用率。但是,按照這種方式創(chuàng)建每個(gè)進(jìn)程要付出一定的代價(jià):設(shè)置一個(gè)進(jìn)程要占用相當(dāng)一部分處理器時(shí)間和內(nèi)存資源。而且,大多數(shù)操作系統(tǒng)不允許進(jìn)程訪問(wèn)其他進(jìn)程的內(nèi)存空間。因此,進(jìn)程間的通信很不方便,并且也不會(huì)將它自己提供給容易的編程模型。

  ☆ 線程
  線程也稱為輕型進(jìn)程 (LWP)。因?yàn)榫€程只能在單個(gè)進(jìn)程的作用域內(nèi)活動(dòng),所以創(chuàng)建線程比創(chuàng)建進(jìn)程要廉價(jià)得多。這樣,因?yàn)榫€程允許協(xié)作和數(shù)據(jù)交換,并且在計(jì)算資源方面非常廉價(jià),所以線程比進(jìn)程更可取。線程需要操作系統(tǒng)的支持,因此不是所有的機(jī)器都提供線程。Java 編程語(yǔ)言,作為相當(dāng)新的一種語(yǔ)言,已將線程支持與語(yǔ)言本身合為一體,這樣就對(duì)線程提供了強(qiáng)健的支持。

  使用 Java 編程語(yǔ)言實(shí)現(xiàn)線程

  Java 編程語(yǔ)言使多線程如此簡(jiǎn)單有效,以致于某些程序員說(shuō)它實(shí)際上是自然的。盡管在 Java 中使用線程比在其他語(yǔ)言中要容易得多,仍然有一些概念需要掌握。要記住的一件重要的事情是 main() 函數(shù)也是一個(gè)線程,并可用來(lái)做有用的工作。程序員只有在需要多個(gè)線程時(shí)才需要?jiǎng)?chuàng)建新的線程。

  Thread 類
  Thread 類是一個(gè)具體的類,即不是抽象類,該類封裝了線程的行為。要?jiǎng)?chuàng)建一個(gè)線程,程序員必須創(chuàng)建一個(gè)從 Thread 類導(dǎo)出的新類。程序員必須覆蓋 Thread 的 run() 函數(shù)來(lái)完成有用的工作。用戶并不直接調(diào)用此函數(shù);而是必須調(diào)用 Thread 的 start() 函數(shù),該函數(shù)再調(diào)用 run()。下面的代碼說(shuō)明了它的用法:

  創(chuàng)建兩個(gè)新線程

  import java.util.*;

  class TimePrinter extends Thread {
   int pauseTime;
   String name;
   public TimePrinter(int x, String n) {
   pauseTime = x;
   name = n;
   }

   public void run() {
   while(true) {
   try {
   System.out.println(name + ":" + new
   Date(System.currentTimeMillis()));
   Thread.sleep(pauseTime);
   } catch(Exception e) {
   System.out.println(e);
   }
   }
   }

   static public void main(String args[]) {
   TimePrinter tp1 = new TimePrinter(1000, "Fast Guy");
   tp1.start();
   TimePrinter tp2 = new TimePrinter(3000, "Slow Guy");
   tp2.start();
  
   }
  }

  在本例中,我們可以看到一個(gè)簡(jiǎn)單的程序,它按兩個(gè)不同的時(shí)間間隔(1 秒和 3 秒)在屏幕上顯示當(dāng)前時(shí)間。這是通過(guò)創(chuàng)建兩個(gè)新線程來(lái)完成的,包括 main() 共三個(gè)線程。但是,因?yàn)橛袝r(shí)要作為線程運(yùn)行的類可能已經(jīng)是某個(gè)類層次的一部分,所以就不能再按這種機(jī)制創(chuàng)建線程。雖然在同一個(gè)類中可以實(shí)現(xiàn)任意數(shù)量的接口,但 Java 編程語(yǔ)言只允許一個(gè)類有一個(gè)父類。同時(shí),某些程序員避免從 Thread 類導(dǎo)出,因?yàn)樗鼜?qiáng)加了類層次。對(duì)于這種情況,就要 runnable 接口。

感謝各位的閱讀,以上就是“Java 程序中的多線程原理及用法”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java 程序中的多線程原理及用法這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI