- 進程是受操做系統管理的基本運行單元。
- 線程是在進程中獨立運行的子任務。使用多任務操做系統Windows後,能夠最大限度地利用CPU的空閒時間來處理其餘的任務。使用多線程能夠,提升CPU利用率,也就是使用異步,線程被調用的時機是隨機的。
- 使用多線程技術時,代碼的運行結果與代碼執行順序或調用是無關的。隨機性。
- Thread.java類中的start()方法通知「線程規劃器」此線程已經準備就緒,等待調用線程對象的run()方法。執行start()方法發順序不表明線程的啓動的順序。
- 共享數據的狀況就是多個線程能夠訪問同一個變量,會出現線程不安全的問題。
- synchronized能夠在任意對象及方法上加鎖,而加鎖的這段代碼稱爲「互斥區」或「臨界區」。
- 非線程安全主要是指多個線程對同一個對象中的同一個實例變量進行操做時,會出現值被改變,值不一樣的狀況。
- 雖然println()方法在內部是同步的,但i--的操做倒是在進入println()以前發生的。
- currentThread()方法可返回代碼段正在被哪一個線程調用的信息。
- 大多數中止一個線程的操做使用Thread.interrupt()方法,但這個方法不會終止一個正在運行的線程,須要加入一個判斷才能夠完成線程的中止。
- this.interrupted()測試當前線程是否已經中斷。當前線程是指運行this.interrupted()方法的線程。線程中斷狀態由該方法清除。
- this.isInterrupted()測試線程是否已經中斷。測試線程Thread對象是否已是中斷狀態,但不清除狀態標誌。
- 能中止的線程——異常法
public class MyThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
for (int i = 0; i < 500000; i++) {
if(this.isInterrupted()){
System.out.println("已是中止狀態了!我要退出");
throw new InterruptedException();
}
System.out.println("i="+(i+1));
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Run {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(2000);
myThread.interrupt();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("end");
}
}
- 若是在sleep狀態下中止某一線程,會進入catch語句,而且清除中止狀態,使之變成false;
- 建議使用「拋異常」法來實現線程的中止,由於在catch塊中能夠對異常的信息進行相關的處理,並且使用異常流能更好,更方便地控制程序的運行流程,不至於代碼中出現不少個return,形成污染。
- 在使用suspend與resume方法時,若是使用不當,極易形成公共的同步對象的獨佔,使得其餘線程沒法訪問公共同步對象。也容易出現由於線程的暫停而致使數據不一樣步的狀況。
- yield()方法的做用是放棄當前的cpu資源,將它讓給其餘的任務去佔用cpu執行時間。
- 高優先級的線程總數大部分先執行完,但不表明高優先級的線程所有先執行完。
- 當進程中不存在非守護線程了,則守護線程自動銷燬。典型的守護線程就是垃圾回收線程。調用thread.setDaemon(true);設置守護線程。