一.線程的基本概念
1.線城市一個程序內部的順序控制流。
2.Java的線程是通過java.lang.Thread類來實現的。
3.VM啟動時會有一個由主方法{public static void main(Args[] String)}所定義的線程。
4.可以通過創建新的Thread實例來創建新的線程。
5.每個線程都是通過某個特定的Thread對象所對應的方法run()來完成其操作的,方法run()稱為線程體。
6.通過調用Thread類的start()方法來啟動一個線程。
注意:多進程(在操作系統中能同時運行多個任務(程序));多線程(在同一應用程序中有多個順序流同時執行)。
二.線程的建立
1.定義線程類,實現Runnable接口(推薦,更靈活):
Thread thread = new Threa(target); //target為Runnable接口類型;
Runnable中只有一個方法:public void run(); //用於定義線程運行體。
*使用Runnable接口可以為多個線程提供共享的數據。
在實現Runnable接口的類的run方法定義中可以使用Thread的靜態方法:
public static Thread currentThread() 獲取當前線程的引用。
public class ThreadTheory { public static void main(String args[]){ Runner1 runner1 = new Runner1(); Thread thread = new Thread(runner1); thread.start(); for(int i=0;i<10;i++){ System.out.println("Main Thread:"+i); } } } public class Runner1 implements Runnable { public void run() { for(int i=0;i<10;i++){ System.out.println("Runner1:"+i); } } } View Code 2.繼承Thread類,重寫run方法:
class MyThread extends Thread{
public void run(){......}
}
然後生成該類的對象:
MyThread myThread = new MyThread(...);
public class ThreadTheory { public static void main(String args[]){ Runner2 runner2 = new Runner2(); runner2.start(); //runner2本身就是一個線程了,不用再new Thread(); for(int i=0;i<10;i++){ System.out.println("Main Thread:"+i); } } } public class Runner2 extends Thread { public void run() { for(int i=0;i<10;i++){ System.out.println("Runner2:"+i); } } } View Code
三.線程控制的基本方法
public static void sleep(long millis) throws InterruptedException
millis
- 以毫秒為單位的休眠時間。InterruptedException
- 如果另一個線程中斷了當前線程。當拋出該異常時,當前線程的中斷狀態 被清除。
public void interrupt()
如果當前線程沒有中斷它自己(這在任何情況下都是允許的),則該線程的 checkAccess
方法就會被調用,這可能拋出 SecurityException
。
如果線程在調用 Object
類的 wait()
、wait(long)
或 wait(long, int)
方法,或者該類的 join()
、join(long)
、join(long, int)
、sleep(long)
或 sleep(long, int)
方法過程中受阻,則其中斷狀態將被 清除,它還將收到一個 InterruptedException
。
如果該線程在可中斷的通道
上的 I/O 操作中受阻,則該通道將被關閉,該線程的中斷狀態將被設置並且該線程將收到一個
ClosedByInterruptException
。
如果該線程在一個 Selector
中受阻,則該線程的中斷狀態將被設置,它將立即從選擇操作返回,並可能帶有一個非零值,就好像調用了選擇器的 wakeup
方法一樣。
如果以前的條件都沒有保存,則該線程的中斷狀態將被設置。
SecurityException
- 如果當前線程無法修改該線程
注意:舒適的結束線程的方法(拒絕暴力):
public class ThreadTheory { public static void main(String args[]){ MyThread myThread = new MyThread(); myThread.start(); try{ Thread.sleep(10000); }catch(InterruptedException e){} myThread.stopThread(); //通過標志去結束線程 } } public class MyThread extends Thread { private boolean flag = true; public void stopThread(){ this.flag = false; } public void run() { while(flag){ System.out.println("===當前時間"+ new Date() + "==="); try{ sleep(1000); }catch(InterruptedException e){ return; } } } } View Code