如果一個程序能夠運行多個線程,那么這個程序式多線程的.每個任務在一個線程中執(zhí)行,執(zhí)行線程簡稱線程.
線程與進程的區(qū)別
- 進程是指在系統(tǒng)中正在運行的一個應用程序,它描述程序?qū)W(wǎng)絡,磁盤,內(nèi)存,CPU等一系列的占用.
- 線程是進程內(nèi)獨立的單元,一個進程內(nèi)有若干個線程,但至少有一個線程,一般稱為主線程
實現(xiàn)線程的兩種方式
- 建立Thread類的子類來定義線程,構(gòu)造Tread類的子類的對象,調(diào)用start()方法.這種方法不建議使用,應當把運行任務與運行機制解耦.如果有多個任務,每個任務都需要創(chuàng)建一個單獨線程,開銷會太大.
- 實現(xiàn)Runnable接口,實現(xiàn)Runnable接口的類并不是一個線程類,重寫run方法中定義了運行任務,通過Thread的類創(chuàng)建線程對象.
實際上兩種方式實現(xiàn)機制相同,Thread類是Runnable接口的實現(xiàn)類.Runnable的實現(xiàn)類定義了線程任務,Thread類是創(chuàng)建線程的機制.
線程的狀態(tài)
New(新建)
用new操作符創(chuàng)建一個新的線程時,線程未開始,在開始前做基礎工作.Runnable(可運行)
可運行其實可以分解為:就緒態(tài)和運行態(tài),就緒態(tài)意味著程序未運行,需要操作系統(tǒng)提供具體的運行時間.
現(xiàn)在所有的桌面以及服務器操作系統(tǒng)都使用搶占式調(diào)度.Blocked(阻塞)
Waiting(等待)
Timed wating(計時等待)
Terminated(終止)
基本方法
java.lang.Thread
- Thread(Runnble target)
構(gòu)造一個新線程,調(diào)用指定目標的run()方法 - void start()
啟動這個線程,從而調(diào)用run方法
注意:不要調(diào)用Runnable對象或者Thread類中的run方法,直接調(diào)用run方法只會在同一個線程中執(zhí)行這個任務,而沒有啟動多線程.實際上應當調(diào)用Thread.strat方法,這會創(chuàng)建一個執(zhí)行run方法的新線程. - static voidf sleep(long millis)
休眠指定的毫秒數(shù) - static void yield()
使當前正在執(zhí)行的線程向另個一線程交出執(zhí)行權(轉(zhuǎn)為就緒態(tài)) - void join()
等待終止指定的線程(等待子線程終止,主線程才能轉(zhuǎn)為就緒) - setPriority();
設置線程優(yōu)先級,10最大,1最小,默認為5 - currentThread()
獲取當前所執(zhí)行的Tread類 - setName() getName()
獲取更改線程名
代碼示例
使用sleep方法進行排序
package com.apescource.demo;
/*
*Thread.sleep()方法示例
*/
public class Demo6 {
public static void main(String[] args) {
// 數(shù)字數(shù)組
int[] numbers = { 3, 9, 4, 23, 12, 9, 14 };
// 線程數(shù)組
Thread[] threads = new Thread[numbers.length];
// 線程數(shù)組與數(shù)字數(shù)組一一對應
for (int i = 0; i < numbers.length; i++) {
//創(chuàng)建所有的線程
threads[i] = new Thread(new NumberThread(numbers[i]));
}
//線程全部進入就緒態(tài)
for (int i = 0; i < threads.length; i++) {
threads[i].start();
}
}
}
class NumberThread implements Runnable {
private int number;
public NumberThread(int number) {
this.number = number;
}
@Override
public void run() {
try {
Thread.sleep(number*100);
System.out.println(number);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}