轉:-----------------http://softstone.javaeye.com/blog/172911
一、進程、線程
進程通常是一個程序的實例。但進程是不活動的,必須有一個線程,線程負責執行地址空間中的進程代碼。一個進程可以同時運行多個線程,每個線程擁有自己的堆棧、
CPU
寄存器和
CPU
時間。多個線程共享進程佔有的資源,比如地址空間、動態內存、文件等。
Java
虛擬機中線程可以粗略的如下表示:
Java Virtual Machine ------------------|-----Thread1---->Local Variables
|-----
Thread1---->Local Variables
Global Memory································· |-----
Thread1---->Local Variables
可以看到,每個線程有自己的本地變量,同時也共享在
Java
虛擬機中的全局存儲。
二、創建線程
Java中創建線程又兩種方式,一種是繼承Thread類,一種是實現Runnable接口。對於Thread的繼承類,直接new即可,對於Runnable的實現類,用這個接口的實現類來new一個線程。
代碼示例如下:
//繼承Thread類
public class FirstThread extends Thread {
//
需要繼承run方法
public void run() {
try {
for (int i = 0; i < 20; i++) {
sleep(500);
System.out.println(getName());
}
} catch (InterruptedException e) {
//
處理線程被終止的情況
e.printStackTrace();
}
}
}
//實現Runnable接口
public class SecondThread implements Runnable {
//Runnable
接口只有一個run方法,必須實現。
public void run() {
try {
for (int i = 0; i < 20; i++) {
Thread.sleep(400);
System.out.println(Thread.currentThread().getName());
}
} catch (InterruptedException e) {
//
處理線程被終止的情況
e.printStackTrace();
}
}
}
//執行線程
FirstThread t1 = new FirstThread();
t1.setName("thread1");
FirstThread t2 = new FirstThread();
t2.setName("thread2");
SecondThread r1 = new SecondThread();
Thread t3 = new Thread(r1);
Thread t4 = new Thread(r1);
t3.setName("thread3");
t4.setName("thread4");
t1.start();
t2.start();
t3.start();
t4.start();
需要注意,線程的執行必須使用start方法。
三、線程和對象
在Java中,創建線程是通過創建一個線程對象實現的,這就容易讓人混淆,線程和對象有什麼關係嗎?其實兩者之間沒有關係。
線程是一個動態的概念,一個執行的概念,在Java虛擬機中,線程可以看作是一組語句的執行序列。
對象是一種封裝方式,在Java中,一切都是對象,線程也需要通過對象來表達。Thread class也僅僅是一個對象,可以被其他的線程對象引用,其中的方法既可以被自身表達的線程所執行,也可以被其他的線程所執行。
四、線程的生命週期
該圖截自
sun
網站
線程啓動:調用
start
()方法啓動線程
線程運行:線程啓動後運行
run
()方法體內代碼
線程阻塞:線程
sleep()
,
wait
線程結束:自讓運行完畢退出。
線程的終止
兩種終止方法。
一種是自然終止,run方法執行完退出。比如:
public void run( ) {
while (!done) {
...
}
}
另一種是調用Thread.interrupt()方法,中斷wait()或Sleep方法,終止線程。
public void run() {
try {
for (int i = 0; i < 400; i++) {
Thread.sleep(400);
System.out.println(Thread.currentThread().getName());
}
} catch (InterruptedException e) {
//
處理線程被終止的情況
e.printStackTrace();
}
}
Thread.interrupt()
方法會導致sleep、join或wait等方法拋出InterruptedException異常,在catch
InterruptedException的方法中,退出線程,但是線程在執行任務的時候是不會拋出InterruptedException。
其他兩個方法
Thread.interrupted()
檢查線程的中斷狀態,同時清除中斷狀態。
Thread.isInterrupt()
檢查當前線程是否出於中斷狀態。