標籤:get nts 並存執行 row 整合 [] 哪些 優先 static
一、什麼是線程?
線程:程式中一個單一的順序控制流程程。進程內一個相對獨立的、可調度的執行單元,是系統獨立調度和指派CPU的基本單位。
多線程:單個程式中同時運行多個線程完成不同的工作,稱為多線程。
特點:
1)輕量級的進程,程式運行流中可執行檔最小單元,線程不擁有系統資源,多個線程共用進程擁有的資源。
2)一個線程可以建立另外一個線程,多個線程可以並發執行。
3)多個線程在系統運行中搶佔資源,會出現間斷性,我們看到的是並存執行,其實在有先後順序的。
4)一個進程至少包含一個線程,即主線程。
二、線程有哪些狀態?
線程具有:建立,就緒,運行,阻塞,終止五種狀態。
①建立:線程被建立,沒有執行任何方法,如,Thread th = new Thread()。
②就緒:當調用線程的start方法時,就會觸發線程狀態變更為就緒態,等待cpu來調用。處於就緒態的線程才會被cpu調度,單cpu不是立即執行它。
③運行:當cpu發起對此線程調用時,它就進入了運行態。
④阻塞:當線程由於某種原因,不再擁有cpu使用權,它就會被阻塞。
阻塞有以下幾種情況:
1)sleep(long mills):參數為毫秒數,使線程在指定的時間內進入阻塞,時間一過,進入就緒態。
2)suspend() 和 resume():suspend會讓線程掛起,必須執行resume進行線程的恢複。
3)yield():與sleep()類似,但是不能由使用者指定暫停多長時間,只能出讓機會給同優先順序的線程,且不進入阻塞。如同排隊,前面的人和後面的人交換位置,但是還處在隊伍中。
4)wait() 和 notify():wait() 使線程進入阻塞狀態,有兩種形式,一種指定毫秒數,另一種無參。前者可通過notify()喚起或者超過指定時間自動回復;後者必須通過notify()喚起。
5)同步阻塞:等待同步鎖資源。多線程競爭同一個資源時,只能一個線程獲得鎖,其它的線程要等待。
⑤終止:線程執行完畢,或者出現異常,線程結束。
三、如何建立線程?
java線程的實現方式有三種:繼承Thread類、實現Runnable介面,使用Callable和FutureTask(可以有傳回值)
1、通過整合Thread類,覆寫run()方法
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
MyThread th1 = new MyThread();
MyThread th2 = new MyThread();
th1.start();
th2.start();
}
}
輸出:main
Thread-1 0
Thread-0 0
Thread-1 1
Thread-1 2
......
線程要實現的邏輯寫在run方法中,通過執行線程的start()方法,使線程進入就緒狀態,等待CPU分配資源。
可以看到兩個線程並存執行,且隨機獲得CPU。
2、試過實現Runnable介面,實現run()方法
class MyThread implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
MyThread th = new MyThread();
Thread t1 = new Thread(th);
Thread t2 = new Thread(th);
t1.start();
t2.start();
}
}
輸出:main
Thread-0 0
Thread-0 1
Thread-1 0
Thread-0 2
......
通過將MyThread執行個體傳入Thread構造方法執行個體化Thread,調用Thread的start方法,啟動線程。
ps:繼承Thread和實現Runnable介面有什麼區別呢?
1:前者為單繼承,有局限性,但介面的方式可以實現多個。
2:後者可以實現資源共用。
多線程編程中,強烈建議使用Runnable
3、使用Callable和Future介面建立線程。
具體是建立Callable介面的實作類別,並實現clall()方法。
並使用FutureTask類來封裝Callable實作類別的對象,且以此FutureTask對象作為Thread對象的target來建立線程。
class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
return 1;
}
}
public class ThreadDemo {
public static void main(String[] args) {
Callable<Integer> myCallable = new MyCallable();//執行個體化MyCallable
FutureTask<Integer> ft = new FutureTask<>(myCallable);//通FutureTask封裝
Thread thread = new Thread(ft);//將FutureTask傳入Thread構造,執行個體化線程
thread.start();//線程啟動
Integer result = ft.get();//擷取傳回值
System.out.println(result);
}
}
1)實現Callable介面中的call()方法,這個是線程要執行的邏輯。
2)FutureTask的get()方法會一直阻塞,直到call()方法執行完畢取到傳回值。
關注老薑談技術,號:helojava,或者掃描下面二維碼。
每日一帖,技術雞湯。
java多線程實現方式