此文是對《JAVA多線程編程核心技術》的一點總結,如果想要了解具體細節可以去看原書。
第一章 多線程技能
- 線程的啓動
實現多線程編程的方式主要有兩種,一種是繼承Thread類,另一種是實現Runnable接口。
1.繼承Thread類,並且重寫run方法。
public class MyThread extends Thread {
public static void main(String args[])
{
(new Thread(new MyThread())).start();
System.out.println("main thread run ");
}
@Override
public void run() {
super.run();
System.out.println("MyThread");
}
}
2.實現Runnable接口
public class MyRunnable implements Runnable{
public static void main(String args[])
{
(new Thread(new MyRunnable())).start();
System.out.println("main thread run ");
}
@Override
public void run()
{
System.out.println("Runnable run ");
}
}
-
如何讓線程暫停
1.雖然suspend和resume方法可以分別使得線程暫停和回覆,但是這兩個方法因爲有缺點而已經被棄用。缺點:
a.獨佔:在使用suspend和resume方法時,如果使用不當,極易造成公共的同步對象獨佔,使得其他線程無法訪問公共同步對象。 b.不同步:在使用suspend與resume方法時也容易因爲線程而導致數據不同步的情況。
2.可以使用yield方法進行暫停。
yield()方法的作用是放棄當前的CPU資源,將它讓給其他任務去佔用CPU執行時間。但放棄的時間不確定,有可能剛剛放棄,馬上又獲得CPU時間片。
3.可以使用Thread類的Sleep()方法讓線程暫停一段時間。需要注意的是,這並不會讓線程終止,一旦從休眠中喚醒線程,線程的狀態將會被改變爲Runnable,並且根據線程調度,它將得到執行。4.可以使用thread.wait()方法來讓線程暫停一段時間,wait方法裏面填寫的是暫停的時間的長度,一毫秒爲單位
-
如何使線程停止
停止一個線程通常意味着在線程處理任務完成之前停掉正在做的操作,也就是放棄當前的操作。
在 Java 中有以下 3 種方法可以終止正在運行的線程:
a.使用退出標誌,使線程正常退出,也就是當 run() 方法完成後線程中止。
b.使用 stop() 方法強行終止線程,但是不推薦使用這個方法,該方法已被棄用。
c.使用 interrupt 方法中斷線程。
這裏主要介紹使用interrupt 方法中斷線程
使用interrupt() 方法並不像在 for 循環語句中使用 break 語句那樣乾脆,馬上就停止循環。調用 interrupt() 方法僅僅是在當前線程中打一個停止的標記,並不是真的停止線程。
在Thread.java類裏提供了兩種方法判斷線程是否爲停止的。
this.interrupted():測試當前線程是否已經中斷(靜態方法)。如果連續調用該方法,則第二次調用將返回false。在api文檔中說明interrupted()方法具有清除狀態的功能。執行後具有將狀態標識清除爲false的功能。
this.isInterrupted():測試線程是否已經中斷,但是不能清除狀態標識
異常法示例
public class MyThread4 extends Thread {
@Override
public void run() {
super.run();
try {
for (int i = 0; i < 50000; i++) {
if (this.isInterrupted()) {
System.out.println( "線程已經結束,我要退出" );
// return;
throw new InterruptedException();
}
System.out.println( "i=" + (i + 1) );
}
System.out.println( "我是for下面的語句,我被執行說明線程沒有真正結束" );
} catch (InterruptedException e) {
System.out.println( "進入MyThread.java類中run方法的catch異常了" );
e.printStackTrace();
}
}
}
- 線程的優先級
在操作系統中,線程可以劃分優先級,優先級較高的線程得到的CPU資源較多,也就是CPU優先執行較高的線程對象中的任務。
a.線程的優先級具有繼承性,比如A線程啓動B線程,則B線程的優先級與 A是一樣的。 - 線程安全相關的問題
當多個線程訪問某個類,不管運行時環境採用何種調度方式或者這些線程如何交替執行,並且在主調代碼中不需要任何額外的同步或協同,這個類都能表現出正確的行爲,那麼就稱這個類爲線程安全的