第一章 java多線程技能java
1 線程:進程是操做系統結構的基礎,是一次程序的執行,是一個程序及其數據在處理順序時發生的活動;是程序在一個數據集合上運行的過程,他是系統進行資源分配和調度的一個獨立單位。編程
而線程是進程中獨立運行的子任務。安全
打印當前線程名:System.out.println(Thread.currentThread().getName());多線程
2 實現多線程編程ide
有兩種方式,一是繼承Thread,二是實現Runnable,運行起來具備隨機性。測試
1.實現接口:this
public class MyRunnable implements Runnable{操作系統
@Override線程
public void run() {對象
// TODO Auto-generated method stub
}
}
實現運行:
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
2.繼承Thread:
public class MyThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
}
}
實現運行:
MyThread myThread = new MyThread();
myThread.start();
非線程安全:指多個線程對同一個對象中的同一個實例變量進行操做時會出現值被修改,值不一樣步的狀況。
3 線程方法集合
1. currentThread()方法返回當前正在執行的線程名稱;
System.out.println(Thread.currentThread().getName());
2. isAlive()的功能是判斷當前的線程是否還處於存活狀態,活動狀態,要求線程還在準備運行的狀態或者正在執行(已經啓動且還沒有終止);
3. sleep()方法是指定毫秒數內讓當前正在執行的線程休眠;(Thread.sleep())
4. getId()取得線程的惟一標識;返回long
4 中止線程
1. 中止一個線程能夠使用Thread.stop()方法,但最好不要使用,由於不安全。
2. 大多數中止一個線程的操做使用Thread.interrupt()方法,但這個方法不會終止一個正在運行
的線程,還須要加入一個判斷才能夠完成線程的中止,判斷線程是否中止:
1.this.interrupted()測試當前線程是否已經中斷。
2.this.isInterrupted()測試線程是否已經中斷。
關於interrupt()方法,它會將一個標誌爲設置爲true,這個時候用interrupted()會返回true:
Thread.currentThread().interrupt();
if (isInterrupted()) {
break;
//或者throw new InterruptedException();
}
這個通常使用isInterrupted,由於使用interrupted會把標誌位修改設反。
在java中有如下三種方法能夠終止正在運行的線程:
(1)使用退出標誌,使線程正常退出,也就是當run方法完成以後線程退出;
(2)使用stop方法強行退出,可是不推薦使用這個方法,由於stop和suspend及resume
同樣,都是過時做廢的方法,使用它們可能會產生不可預料的結果;
(3)使用interrupt方法中斷線程
5 暫停線程
使用suspend方法暫停線程,使用resume方法恢復線程的執行。
缺點當使用不當,極容易形成公共的同步對象的獨佔,使得其餘的線程沒法訪問公共對象。
還有也會形成數據不一樣步。
注意點
當程序運行到println()內部的時候,同步鎖尚未釋放。
6 yield方法
放棄當前的cpu資源,將它給其餘的任務去佔用cpu執行時間,但放棄的時間不肯定,有可能剛剛放棄,立刻又得到了cpu時間片。
7. 線程的優先級
線程能夠劃分優先級,優先級高的線程獲得的cpu資源比較多,是cpu優先執行優先級高的線程
設置優先級使用setPriority(),1-10等級,若是超過這個範圍的話會拋出throw new IllegalArgumentException()。
jdk預設的優先級的值
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORTT = 5;
public final static int MAX_PRIORTY = 10;
線程的優先級具備繼承性,好比A線程啓動B線程,則B線程的優先級與A是同樣的。
優先級是設置了,可是不必定最高的就一直在執行,由於它仍是隨機的。
8 守護線程
java裏有兩種線程,一個是用戶線程,一個是守護線程。
守護線程是陪伴,但進程中不存在非守護線程的時候纔會自動撤銷,典型的守護線程時垃圾回收線程。典型的應用是GC(垃圾回收器)。
thead.setDeamon(true);