国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java線程簡介(線程的生命)

2019-11-18 10:47:37
字體:
來源:轉載
供稿:網友

  1、創建線程
  
  
  在 java 程序中創建線程有幾種方法。每個 Java 程序至少包含一個線程:主線程。其它線程都是通過 Thread 構造器或實例化繼續類 Thread 的類來創建的。
  
  Java 線程可以通過直接實例化 Thread 對象或實例化繼續 Thread 的對象來創建其它線程。在線程基礎中的示例(其中,我們在十秒鐘之內計算盡量多的素數)中,我們通過實例化 CalculatePRimes 類型的對象(它繼續了 Thread),創建了一個線程。
  
  當我們討論 Java 程序中的線程時,也許會提到兩個相關實體:完成工作的實際線程或代表線程的 Thread 對象。正在運行的線程通常是由操作系統創建的;Thread 對象是由 Java VM 創建的,作為控制相關線程的一種方式。
  
  2、創建線程和啟動線程并不相同
  
  
  在一個線程對新線程的 Thread 對象調用 start() 方法之前,這個新線程并沒有真正開始執行。Thread 對象在其線程真正啟動之前就已經存在了,而且其線程退出之后仍然存在。這可以讓您控制或獲取關于已創建的線程的信息,即使線程還沒有啟動或已經完成了。
  
  通常在構造器中通過 start() 啟動線程并不是好主意。這樣做,會把部分構造的對象暴露給新的線程。假如對象擁有一個線程,那么它應該提供一個啟動該線程的 start() 或 init() 方法,而不是從構造器中啟動它。
  
  3、結束線程
  
  
  線程會以以下三種方式之一結束:
  
  線程到達其 run() 方法的末尾。
  
  
  線程拋出一個未捕捉到的 Exception 或 Error。
  
  
  另一個線程調用一個棄用的 stop() 方法。棄用是指這些方法仍然存在,但是您不應該在新代碼中使用它們,并且應該盡量從現有代碼中除去它們。
  當 Java 程序中的所有線程都完成時,程序就退出了。
  
  4、加入線程
  
  Thread API 包含了等待另一個線程完成的方法:join() 方法。當調用 Thread.join() 時,調用線程將阻塞,直到目標線程完成為止。
  
  Thread.join() 通常由使用線程的程序使用,以將大問題劃分成許多小問題,每個小問題分配一個線程。本章結尾處的示例創建了十個線程,啟動它們,然后使用 Thread.join() 等待它們全部完成。
  
  5、調度
  
  
  除了何時使用 Thread.join() 和 Object.wait() 外,線程調度和執行的計時是不確定的。假如兩個線程同時運行,而且都不等待,您必須假設在任何兩個指令之間,其它線程都可以運行并修改程序變量。假如線程要訪問其它線程可以看見的變量,如從靜態字段(全局變量)直接或間接引用的數據,則必須使用同步以確保數據一致性。
  
  在以下的簡單示例中,我們將創建并啟動兩個線程,每個線程都打印兩行到 System.out:
  
  
  public class TwoThreads {
  
   public static class Thread1 extends Thread {
   public void run() {
   System.out.println("A");
   System.out.println("B");
   }
   }
  
   public static class Thread2 extends Thread {
   public void run() {
   System.out.println("1");
   System.out.println("2");
   }
   }
  
   public static void main(String[] args) {
   new Thread1().start();
   new Thread2().start();
   }
  }
  
  
  我們并不知道這些行按什么順序執行,只知道“1”在“2”之前打印,以及“A”在“B”之前打印。輸出可能是以下結果中的任何一種:
  
  1 2 A B
  1 A 2 B
  1 A B 2
  A 1 2 B
  A 1 B 2
  A B 1 2
  不僅不同機器之間的結果可能不同,而且在同一機器上多次運行同一程序也可能生成不同結果。永遠不要假設一個線程會在另一個線程之前執行某些操作,除非您已經使用了同步以強制一個特定的執行順序。
  
  6、休眠
  
  
  Thread API 包含了一個 sleep() 方法,它將使當前線程進入等待狀態,直到過了一段指定時間,或者直到另一個線程對當前線程的 Thread 對象調用了 Thread.interrupt(),從而中斷了線程。當過了指定時間后,線程又將變成可運行的,并且回到調度程序的可運行線程隊列中。
  
  假如線程是由對 Thread.interrupt() 的調用而中斷的,那么休眠的線程會拋出 InterruptedException,這樣線程就知道它是由中斷喚醒的,就不必查看計時器是否過期。
  
  Thread.yield() 方法就象 Thread.sleep() 一樣,但它并不引起休眠,而只是暫停當前線程片刻,這樣其它線程就可以運行了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 个旧市| 秀山| 吴江市| 马尔康县| 甘德县| 客服| 全椒县| 手游| 石家庄市| 嫩江县| 襄樊市| 剑阁县| 台安县| 安图县| 乌兰察布市| 秀山| 泌阳县| 栖霞市| 黎城县| 大庆市| 嵩明县| 武义县| 航空| 遵义县| 邮箱| 东乌| 邵武市| 绥化市| 洮南市| 西乌珠穆沁旗| 会泽县| 夏邑县| 卫辉市| 罗甸县| 绥芬河市| 米易县| 和田市| 大兴区| 营口市| 利川市| 得荣县|