1. 程式人生 > >Java多執行緒(一)基礎

Java多執行緒(一)基礎

1.關於執行緒與程序的區別:執行緒指程序中的一個執行場景,也就是執行流程,同一個程序中的執行緒共享其程序中的記憶體和資源(共享的記憶體是堆記憶體和方法區記憶體,棧記憶體不共享,每個執行緒有自己的,一個執行緒一個棧。);每個程序是一個應用程式,都有獨立的記憶體空間。多執行緒的使用是為了提高程式的使用率,而非T提高速度。
2.實現多執行緒的常見方式
a.繼承Thread類

public class Test extends Thread {

	private String name;
	public Test(String name) {
		this.name = name;
	}
public void run() { for(int i = 0; i < 7; i++) System.out.println(name + ":" + i); } } public class ThreadTest { public static void main(String[] args) { // TODO Auto-generated method stub Test t1 = new Test("A"); Test t2 = new Test("B"); t1.start(); t2.start(); }

執行結果為
A:0
A:1
A:2
A:3
A:4
A:5
A:6
B:0
B:1
B:2
B:3
B:4
B:5
B:6
再次執行
B:0
B:1
B:2
B:3
B:4
A:0
B:5
B:6
A:1
A:2
A:3
A:4
A:5
A:6
注意:每個程式至少有兩個執行緒,垃圾回收執行緒和主執行緒,執行緒呼叫 start() 方法後並非立即執行,而是進入可執行狀態,具體什麼時候執行由作業系統決定。
b.實現Runnable介面

public class RunnableTest implements Runnable {

	private String name;
	public RunnableTest(String name) {
		this.name = name;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub

		for(int i = 0; i < 7 ; i++) {
			System.out.println(name + ":" + i);
		}
	}

	public static void
main(String[] args) { // TODO Auto-generated method stub Thread t1 = new Thread(new RunnableTest("A")); Thread t2 = new Thread(new RunnableTest("B")); t1.start(); t2.start(); } }

執行結果不在展示
繼承Thread與實現Runnable 相比,實現Runnable介面摒棄了只能單繼承的缺點。
3.執行緒的狀態:
a.新建狀態 執行緒物件建立後即處於新建狀態,通過 start() 方法進入就緒狀態,但是要注意已經不能對已經 start的執行緒再次 start 否則會報錯。
b.就緒狀態。已經呼叫了 start() 方法但是還沒被CPU搶到。
c.執行狀態
d.阻塞狀態
e.死亡狀態
4.常用方法
a.sleep
會讓執行緒阻塞設定的時間Thread.sleep(long millis);
b.執行緒讓步:yield
yield只是讓出自己正在執行的機會,進入到就緒狀態,但是再次搶CPU資源的時候還是可能會執行剛才讓出的執行緒。
c.join() : t.join()方法阻塞呼叫此方法的執行緒(calling thread),直到執行緒t完成,此執行緒再繼續;通常用於在main()主執行緒內,等待其它執行緒完成再結束main()主執行緒。join方法必須線上程start方法呼叫之後呼叫才有意義。這個也很容易理解:如果一個執行緒都沒有start,那它也就無法同步了。 其實,join方法是通過呼叫執行緒的wait方法來達到同步的目的的。例如,A執行緒中呼叫了B執行緒的join方法,則相當於A執行緒呼叫了B執行緒的wait方法,在呼叫了B執行緒的wait方法後,A執行緒就會進入阻塞狀態。
d.setPriority(int newPriority) 更改執行緒的優先順序。
e.getPriority() 返回執行緒的優先順序。
注意: 每個執行緒都有一個優先順序,我們也可以自己設定,但是優先順序高的也並非一定先執行,只是他先執行的概率比較大而已。
f.interrupted 和 isInterrupted的區別:注意理解
iIaqR1.png