java中的線程和多線程

說道線程,首先我們要先知道什麼是進程。

1.什麼是進程?

進程:說白了就是一個正在執行的程序。好比你經常玩的LOL,經常編碼用的eclipse等都是一個進程。

在每一個進程中,都有一個控制單元。

2.什麼是線程?

  線程:其實就是進程中的每一個控制單元。也就是說線程控制着進程的執行順序。

          打個比方,好比一個服裝店(進程)只有一間試衣間(一個線程),

   但這個時候同時有很多顧客,但這個時候每次只能有一個顧客能進入試衣間試衣服。

3.創建線程有幾種辦法?

a.extends Thread類。。(Thread的底層其實也是Ruannable接口)

b.implements Runnable這個接口。

記住:(1)無論是繼承還是實現,都要重寫裏面的run方法。最後調用start方法來啓動線程。

    (2)實現Runnable接口後,在調用的時候要先通過Thread類建立對象,然後再調用start()方法。

	Ticket t1 = new Ticket();
	Thread t = new Thread(t1);

4.線程在什麼時候會被啓動?

 在JVM啓動的時候首先創建了一個java.exe的進程,這個進程中至少有一個線程,這個線程存放在main方法。當程序運行的時候,線程被調用,也就是說main方法執行的時候

裏面定義的線程和主線程會被調用,當結束的時候GC(垃圾回收)線程也會被調用。(這個時候也能被稱爲多線程的運行)。

public static void main(String[] args) {
		Test t1 = new Test("one");
		Test t2 = new Test("two");
		t1.start();
		t2.start();
		for(int i =0;i<50;i++){
			System.out.println("main ----  "+i);
		}
	}

}
class Test extends Thread{
	public Test(String name){
		super(name);
	}
	@Override
	public void run() {
		for(int i =0;i<50;i++){
			System.out.println(this.getName()+"----  "+i);
		}
	}
運行的結果:線程是交替執行的,不是執行完一個線程再去執行另一個線程的,而且每次執行的結果也是不同的。

注意:這裏在執行線程的時候,是調用線程中的start()方法來執行線程的,而不是調用被重寫的run方法來執行線程的。(這裏你可以調用run()方法來看看結果)

5.線程執行的五個步驟:



6.如何解決多線程中的線程執行順序的問題

給用到線程的地方加一個同步機制,也就是 synchronized關鍵字。

有兩種方式加synchronized關鍵字,

(1)是在run()裏面在需要被用到線程的地方加上關鍵字。以購票系統來說吧,多個人想買票,這個票就是要被多個人購買(這就是多線程的地方)。

public void run() {
		while(true){
			synchronized(this){
			if(ticket>0){
				
				System.out.println(Thread.currentThread().getName()+"----sale:"+ticket- -);
	
			}
		}
		}
注意:如果要被synchronized關鍵字修飾的方法中有static關鍵字,那麼這個方法中synchronized(當前對象名.class)

這麼寫,是因爲 靜態進內存時,內存中沒有本類對象,但是一定有該類對應的字節碼文件對象,類名.class。


(2)是加在run()方法上,但是這種方式延緩執行時間。

public synchronized void run()



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章