線程 是程序中的執行線程。Java 虛擬機容許應用程序併發地運行多個執行線程。java
每一個線程都有一個優先級,高優先級線程的執行優先於低優先級線程。每一個線程均可以或不能夠標記爲一個守護程序。當某個線程中運行的代碼建立一個新 Thread
對象時,該新線程的初始優先級被設定爲建立線程的優先級,而且當且僅當建立線程是守護線程時,新線程纔是守護程序。安全
當 Java 虛擬機啓動時,一般都會有單個非守護線程(它一般會調用某個指定類的 main
方法)。Java 虛擬機會繼續執行線程,直到下列任一狀況出現時爲止:併發
調用了 Runtime
類的 exit
方法,而且安全管理器容許退出操做發生。ide
非守護線程的全部線程都已中止運行,不管是經過從對 run 方法的調用中返回,仍是經過拋出一個傳播到 run
方法以外的異常。線程
建立新執行線程有兩種方法:code
1): 一種方法是將類聲明爲 Thread
的子類。該子類應重寫 Thread
類的 run
方法。接下來能夠分配並啓動該子類的實例。對象
public class DemoThread1 { /** * @author 牧羊的伯格女皇 * @param args * date:2015-10-15 */ public static void main(String[] args) { //主線程負責執行main方法 SpeakDog dog = new SpeakDog(); // 建立線程 SpeakPig pig = new SpeakPig(); //建立線程 dog.start(); // 啓動線程 pig.start(); // 啓動線程 for( int i=1;i<=10;i++){ System.out.print("羊 "+i+" "); } } } public class SpeakDog extends Thread { // Thread類的子類 @Override public void run() { for( int i=1; i<=5; i++){ System.out.print("狗 "+i+" "); } } } public class SpeakPig extends Thread { @Override public void run() { for( int i=1;i<=7;i++){ System.out.print("豬 " + i +" "); } } } //上述中JVM讓 dog , pig , main 線程輪流使用cpu資源。 //只有當程序中的全部線程結束了,JVM才結束java程序的執行。 //不足: 上述程序在不一樣的而計算機運行或在同一臺計算機反覆運行的結果不盡相同,由於輸出結果引來與當前CPU資源的使用狀況。
2) 建立線程的另外一種方法是聲明實現 Runnable
接口的類。該類而後實現 run
方法。而後能夠分配該類的實例,在建立 Thread
時做爲一個參數來傳遞並啓動。接口
Thread(Runnable target) |
分配新的Thread對象 |
public class DemoThread2 { public static void main(String[] args) { Thread speakdog; //用Thread聲明線程 Thread speakpig; //用Thread聲明線程 SpeakDog dog; // dog 是目標對象 SpeakPig pig; // pig是目標對象 dog = new SpeakDog(); //建立目標對象 pig = new SpeakPig(); // 建立目標對象 speakdog = new Thread(dog); //建立線程 其目標對象是 dog speakpig = new Thread(pig); //建立線程 其目標對象是pig speakdog.start(); //啓動線程 speakpig.start(); //啓動線程 for( int i=1; i<=10;i++){ System.out.print("羊 " + i +" "); } } } public class SpeakDog implements Runnable { @Override public void run() { for( int i=1; i<=5; i++ ){ System.out.print("狗 "+ i + " "); } } } public class SpeakPig implements Runnable { @Override public void run() { for( int i=1; i<=7; i++ ){ System.out.print("豬 "+ i + " "); } } }
線程間能夠共享相同的內存單元(包括代碼與數據) 並利用這些共享單元來實現數據交換,實時通訊與必要的同步操做。內存
對於Thread(Runnable target)構造方法建立線程時,輪到它來想用CPU資源時,目標對象後就會自動調用接口中的run()方法,所以,對於使用同一目標對象的線程,目標對象的成員變量天然就是這些線程共享的數據單元。資源
另外,建立目標對象的類在必要時還能夠是某個特定的子類,所以,使用Runnable接口比使用Thread的子類更具備靈活性。
public class MyThread extends OtherClass implements Runnable { public void run() { System.out.println("MyThread.run()"); } } //當傳入一個Runnable target參數給Thread後,Thread的run()方法就會調用target.run(),參考JDK源代碼: public void run() { if (target != null) { target.run(); } }