java 線程的簡單例子

Java線程:概念與原理

一、操作系統中線程和進程的概念

現在的操作系統是多任務操作系統。多線程是實現多任務的一種方式.

進程是指一個內存中運行的應用程序,每個進程都有自己獨立的一塊內存空間,一個進程中可以啓動多個線程。比如在Windows系統中,一個運行的exe就是一個進程。

線程是指進程中的一個執行流程,一個進程中可以運行多個線程。比如java.exe進程中可以運行很多線程。線程總是屬於某個進程,進程中的多個線程共享進程的內存。

同時執行是人的感覺,在線程之間實際上輪換執行。

二、Java中的線程

Java中,線程指兩件不同的事情:
1
java.lang.Thread類的一個實例;

2、線程的執行。

使用java.lang.Thread類或者java.lang.Runnable接口編寫代碼來定義、實例化和啓動新線程。

一個Thread類實例只是一個對象,像Java中的任何其他對象一樣,具有變量和方法,生死於堆上。

Java中,每個線程都有一個調用棧,即使不在程序中創建任何新的線程,線程也在後臺運行着。

一個Java應用總是從main()方法開始運行,mian()方法運行在一個線程內,它被稱爲主線程。

一旦創建一個新的線程,就產生一個新的調用棧。

  線程總體分兩類:用戶線程和守候線程。

當所有用戶線程執行完畢的時候,JVM自動關閉。但是守候線程卻不獨立於JVM,守候線程一般是由操作系統或者用戶自己創建的


Java線程:創建與啓動

一、定義線程

1、擴展java.lang.Thread類。

此類中有個run()方法,應該注意其用法:

public void run()

如果該線程是使用獨立的Runnable運行對象構造的,則調用該Runnable對象的run方法;否則,該方法不執行任何操作並返回。

Thread的子類應該重寫該方法。

2、實現java.lang.Runnable接口。

  void run()

使用實現接口Runnable的對象創建一個線程時,啓動該線程將導致在獨立執行的線程中調用對象的run方法。

方法run的常規協定是,它可能執行任何所需的操作。

二、實例化線程

1、如果是擴展java.lang.Thread類的線程,則直接new即可。

2、如果是實現了java.lang.Runnable接口的類,則用Thread的構造方法:

Thread(Runnable target) 

Thread(Runnable target, String name) 

Thread(ThreadGroup group, Runnable target) 

Thread(ThreadGroup group, Runnable target, String name) 

Thread(ThreadGroup group, Runnable target, String name, long stackSize)


三、啓動線程

在線程的Thread對象上調用start()方法,而不是run()或者別的方法。

在調用start()方法之前:線程處於新狀態中,新狀態指有一個Thread對象,但還沒有一個真正的線程。

在調用start()方法之後:發生了一系列複雜的事情

啓動新的執行線程(具有新的調用棧);

該線程從新狀態轉移到可運行狀態;

當該線程獲得機會執行時,其目標run()方法將運行。

注意:對Java來說,run()方法沒有任何特別之處。像main()方法一樣,它只是新線程知道調用的方法名稱(和簽名)。因此,在Runnable上或者Thread上調用run方法是合法的。但並不啓動新的線程。


四、例子

/* 使用Runnable接口 */

package snippet;

public class MyThread implements Runnable {

private String name;

public MyThread (String name) {
this.name = name;
}

public static class DoSomething implements Runnable {
private String name;

public DoSomething (String name) {
this.name = name;
}

public void run () {
for (int i = 0; i < 5; i++) {
for (long k = 0; k < 10000000; k++) {
System.out.println(name + ": " + i);
}
}
}
}

public void run () {
for (int i = 0; i < 5; i++) {
for (long k = 0; k < 10000000; k++) {
System.out.println("main: " + i);
}
}
}

public static void main (String[] args) {
DoSomething ds1 = new DoSomething("DoSomething1");
DoSomething ds2 = new DoSomething("DoSomething2");
MyThread mt1 = new MyThread("MyThread1");
MyThread mt2 = new MyThread("mainThread");

Thread t1 = new Thread(ds1);
Thread t2 = new Thread(ds2);
Thread t3 = new Thread(mt1);


// thread 1 2 3
t1.start();
t2.start();
t3.start();

// 主線程
mt2.run();
}


/* 繼承Thread */

public class MyThread extends Thread {
static Thread th;

    public void run() {
        System.out.println("Thread!!");
    } 

    public static void main(String[] args) {
        th = new MyThread().start();
        System.out.println("thread end or main thread");
    } 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章