java基礎知識總結-多線程(二)

1:談下如何實現java中多線程

      1.1: 我們實現java多線程有兩種方式

   1:繼承thread類run方法

  2,實現Runable接口 重寫run方法

package testUtil;

public class TestThread  extends Thread{
	
	@Override
	public void run() {
		for (int i = 0; i <10; i++) {
			System.out.println("Thread body1"+ "  "+i);	
		}
	}

}
package testUtil;

public class TestThread2  extends Thread{
	
	@Override
	public void run() {
		for (int i = 0; i <10; i++) {
			System.out.println("Thread body2"+ "  "+i);	
		}
		
	}

}
package testUtil;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Test {
	public static void main(String[] args) {
		TestThread testThread=new TestThread();
		TestThread2 testThread2=new TestThread2();
			 testThread.start();
			 testThread2.start();

	}

}

結果截圖



1.2 :實現runable接口時候運行

package testUtil;

public class TestThread  implements Runnable{

	@Override
	public void run() {
		for (int i = 0; i <10; i++) {
			System.out.println("Thread body 1"+ "  "+i);	
		}
		
	}
}
package testUtil;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Test {
	public static void main(String[] args) {
	    TestThread testThread=new TestThread();
	    Thread thread=new Thread(testThread);
	    thread.start();
	    
	    TestThread2 testThread2=new TestThread2();
	    Thread thread2=new Thread(testThread2);
	    thread2.start();
	}

}

截圖結果和上面的結果一樣

其實Thread也是實現runable接口,間接相當於實現runable接口了


這個其實就是說明了我們的電腦是多線程運行,多線程(三)纔是真正說明程序的多線程

要想實現程序的,我們必須實現runable來實現,不能通過runbale接口


二:run方法和start方法有什麼區別

       start()方法是讓線程處於就緒狀態,不是運行狀態,等待JVM的調用,當JVM想調用它的時候,這個時候通過run方法來完成實際的操作,當run()方法運行結束,此線程終止

     如果系統不調用start()方法,直接調用run方法,run()就相當於一個普通的方法.(也就是說直接調用run方法是同步操作)

三:同學 麻煩 sleep()和wait()區別 (笑臉 ....)

    這個怎麼說呢,有兩個方面

     3.1:sleep()方法不會釋放鎖,休眠一會自己甦醒,(因爲沒有釋放鎖,所以其他線程不會佔用)不用喊他(這個傢伙比較省事)

     3.2:wait()方法休眠後,會釋放鎖.休眠的時候(因爲釋放掉鎖,所以其他線程可能要佔用) 這個傢伙還必須其他的線程調用

notify()方法將他喚醒(小傢伙不太省事).

     3.3:sleep()可以放到任何位置,而wait()必須放到同步代碼塊或則同步方法中去

     3.4:從位置來說,sleep()是thread類中的靜態方法.wait()是Object類裏面的方法

四:那個再問一下,我們既然可以啓動,暫停,那談下怎能終止的吧(...mmp)

      調用stop()方法.調用suspend()方法.

         談下區別

           調用suspend()方法很容易發生死鎖(兩個進程爭奪資源而相互等待,我們稱爲死鎖)(不會釋放鎖,掛起當前線程 ,其他訪問發生死鎖)

           調用Thread.stop()方法會釋放所有的監視資源,這會導致受監視資源的不一致狀態,導致程序的並不一致性

我們通常不用這兩種方法了,我們通常讓線程進入Dead狀態,自動執行完run方法


package testUtil;

public class TestThread2  implements Runnable{
	// volatile 是被設計用來修飾被不同線程訪問和修改的變量
	private volatile Boolean flag;
	 public void stop()
	 {
		 flag=false;
	 }
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (flag) {
			//xiang幹啥幹啥
		}
	}
}












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