l Threads(執行緒)
注意
l main() method本身就是一個thread。
l 程式進入main()之後,就有兩個thread了,main()與garbage collection。
l 一個thread是一個object,要產生一個thread必須透過java.lang.Thread這個class。
l run() method的語法為”public void run() { ... }”。
l wait(); notify();及notifyAll();須在synchronized context下使用,不然會產生runtime exception:IllegalMonitorStateException。
l sleep()會丟出InterruptedException,使用需有try…catch,不然就要declare throws InterruptedException。
l 重覆呼叫同一執行緒的start(),會導致IllegalThreadStateException,為runtime exception
l synchronized不可用在constroctor。
產生
執行緒
implementing
Runnable interface
01 class MyThread implements Runnable {
02 public void run() { /*....*/ }
03 }
04 public class Test {
05 public static void main(String args[]) {
06 MyThread r = new MyThread();
07 Thread t = new Thread(r);
08 t.start();
09 //......
10 }
11 }
l 定義一個implement Runnable interface的class,且一定要implements run() method,並instantiates這個class,並將此class的instance傳給Thread()。
l Line 7:”r”必須是an instance of Runnable,否則會compile error。
l Line 7:thread “t”被建立後不會馬上執行,必須呼叫start()後才執行。
extends Thread
01 public class MyThread extends Thread {
02 public void run() { /*......*/ }
03 public static void main(String[] args) {
04 MyThread t = new MyThread();
05 t.start();
06 }
07 }
l 定義一個”java.lang.Thread”的subclass,overrides run() method,然後instantiates這個subclass。
l Line 1:要extends Thread class
l Line 2:要override run() method,否則會是空的。
l Line 4:要instantiates Thread的subclass。
控制
執行緒
注意
l thread被new出來後不會馬上執行run()method,必須執行start()後才會進入runnable狀態。
l thread在running state時所執行的是這個thread的run()method。
l thread從runnable到running(實際在CPU執行)或反之是由JVM的thread scheduler任意決定。
l 不管呼叫什麼,頂多只能讓狀態變成runnable,不可能馬上變成running。
不可以
l 一個thread的run()method結束時,這個thread就進入dead state(死掉了),不可以再restart一個dead thread(即再呼叫start()method),否則會compile error。
狀態
改變
l thread遇到下列狀況時,會從running換到blocked state
n Input/Ouput blocked
n sleep()、join()、wait()
n 進入synchronized block,但此synchronized block所保護的object lock已經被其他thread取走。
method
method
Features
Method Type
Class
yield()
static
Thread
run()
instance
Thread
start()
instance
Thread
interrupt()
instance
Thread
sleep(ms)
會丟出InterruptException
ms是long type,單位是millisecond
ms不可省略
static
Thread
join(ms)
會丟出InterruptException
ms是long type,單位是millisecond
若ms為0或空值,則表等待的時間為永遠
instance
Thread
wait(ms)
會丟出InterruptException
ms是long type,單位是millisecond
若ms為0或空值,則表等待的時間為永遠
須事先拿到this object的lock
instance
Object
notify()
須事先拿到this object的lock
instance
Object
notifyall()
須事先拿到this object的lock
instance
Object
来自:【 Garfield 的 SCJP 閱讀筆記 】