亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【java多線程與并發庫】---傳統java多線程<1>線

系統 1740 0

一. 線程的基本概念

1 、入題: 我們大家都知道,我們可以在一臺計算機上同時聊天,看電影,下載視頻等,完成上述任務的各個程序之間是完全相互獨立的。但是他們在同一段時間內又同時處于運行狀態。當然呢,它們在這一段時間內是分時使用計算機 CPU 時間的。只不過呢在 CPU 處理速度很快,劃分的時間片段很短,所以給大家感覺上是多個程序在同時運行。

2 、進程:

進程是程序的一次動態執行過程。這個過程包含了從程序代碼從硬盤加載到內存、在內存中執行、執行結束等過程,實際上也就是進程的產生、發展、消亡的一個過程。

另外,每個進程都有自己的獨立的地址空間和占用的系統資源,在進程執行結束后,進程會釋放系統資源還給系統,供其他程序使用。

3 、線程:

線程是比進程更小的一個執行單位,它是一段完成特定功能的代碼 。

一個進程中可以包含多個線程。

與進程不同的是 : 同類線程將共享進程的地址空間和系統分配給進程的系統資源。線程本身并不占用資源,或者說只占用很少的一部分資源,通常只是寄存器中的數據及供程序使用的堆棧等。因此說在同一個進程的不同線程之間進行切換時,所花費的開銷比在進程間切換小很多。所以,線程又被稱為輕量級進程。

4 java 多線程:

一個進程中可以同時運行多個線程,每個線程執行不同的任務。

5 、多線程的好處:

通過多線程程序設計,就可以將程序任務劃分成幾個并行執行的子任務,從而提高整個程序的執行效率和系統資源的利用率

二. 線程的創建方式

線程 是程序中的執行線程。Java 虛擬機允許應用程序并發地運行多個執行線程。

每個線程都有一個優先級,高優先級線程的執行優先于低優先級線程。每個線程都可以或不可以標記為一個守護程序。當某個線程中運行的代碼創建一個新 Thread 對象時,該新線程的初始優先級被設定為創建線程的優先級,并且當且僅當創建線程是守護線程時,新線程才是守護程序。

當 Java 虛擬機啟動時,通常都會有單個非守護線程(它通常會調用某個指定類的 main 方法)。Java 虛擬機會繼續執行線程,直到下列任一情況出現時為止:

  • 調用了 Runtime 類的 exit 方法,并且安全管理器允許退出操作發生。
  • 非守護線程的所有線程都已停止運行,無論是通過從對 run 方法的調用中返回,還是通過拋出一個傳播到 run 方法之外的異常

Thread類的其中的兩個構造方法

Thread ()
分配新的 Thread 對象。

Thread ( Runnable target)
分配新的 Thread 對象。

實例一:在Thread子類覆蓋的run方法中編寫運行代碼:

    public class ThreadTest01 {

	/**
	 * @param args
	 */

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			Thread thread = new Thread(){
				@Override
				public void run(){ //覆寫Thread類的run方法
					int i = 0;
					while(i<5){
						try {
							//使線程休眠1s,線程由運行狀態進入阻塞狀態,阻塞時間單位是毫秒
							//sleep()方法是靜態的,不需要特定的Thread對象就可以調用它,注意會拋出異常
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						System.out.println("thread:"+Thread.currentThread().getName());//打印當前線程的名字
						System.out.println("2:"+this.getName());
						i++;
					}
				}
			};
			//調用start方法啟動線程:用戶不能直接調用Thread類中的run方法,而是需要調用start方法間接調用run方法。
			
			/*   Thread中run方法的definition
			 
			  public void run() {
					if (target != null) {
					    target.run();
					}
    			}
			  
			 */
			thread.start();
  


運行結果:

【java多線程與并發庫】---傳統java多線程<1>線程基本概念

實例二:在傳遞給Thread類的Runnable對象的run方法中編寫運行代碼

    public class ThreadTest01 {

	/**
	 * @param args
	 */

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			Thread thread = new Thread(){
				@Override
				public void run(){ //覆寫Thread類的run方法
					int i = 0;
					while(i<5){
						try {
							//使線程休眠1s,線程由運行狀態進入阻塞狀態,阻塞時間單位是毫秒
							//sleep()方法是靜態的,不需要特定的Thread對象就可以調用它,注意會拋出異常
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						System.out.println("thread:"+Thread.currentThread().getName());//打印當前線程的名字
						System.out.println("2:"+this.getName());
						i++;
					}
				}
			};
			//調用start方法啟動線程:用戶不能直接調用Thread類中的run方法,而是需要調用start方法間接調用run方法。
			
			/*   Thread中run方法的definition
			 
			  public void run() {
					if (target != null) {
					    target.run();
					}
    			}
			  
			 */
			thread.start();
			
			
			Thread thread2 = new Thread(new Runnable(){
				@Override
				public void run(){ //覆寫Thread類的run方法
					int i = 0;
					while(i<5){
						try {
							//使線程休眠1s,線程由運行狀態進入阻塞狀態,阻塞時間單位是毫秒
							//sleep()方法是靜態的,不需要特定的Thread對象就可以調用它,注意會拋出異常
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						System.out.println("thread2:"+Thread.currentThread().getName());//打印當前線程的名字
						
						i++;
					}
				}
			});
			thread2.start();
			
	}

}

  


運行結果:

【java多線程與并發庫】---傳統java多線程<1>線程基本概念

那么大家可以思考這樣兩個問題:

問題一、如果Thread類的run方法被覆寫了,并且為Thread類傳遞的Runnable對象的run方法也編寫了運行代碼?那么程序會執行哪一個run方法呢?

實例三:來說明上述問題

    public class ThreadTest01 {

	/**
	 * @param args
	 */

	public static void main(String[] args) {
		
		new Thread(
				new Runnable(){
					public void run(){ //覆寫Thread類的run方法
						int i = 0;
						while(i<5){
							try {
								//使線程休眠1s,線程由運行狀態進入阻塞狀態,阻塞時間單位是毫秒
								//sleep()方法是靜態的,不需要特定的Thread對象就可以調用它,注意會拋出異常
								Thread.sleep(1000);
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							System.out.println("Runnable:"+Thread.currentThread().getName());//打印當前線程的名字
							
							i++;
						}
					}
				}		
			){
				public void run(){ //覆寫Thread類的run方法
					int i = 0;
					while(i<5){
						try {
							//使線程休眠1s,線程由運行狀態進入阻塞狀態,阻塞時間單位是毫秒
							//sleep()方法是靜態的,不需要特定的Thread對象就可以調用它,注意會拋出異常
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						System.out.println("thread:"+Thread.currentThread().getName());//打印當前線程的名字
						
						i++;
					}
				}
			}.start();
			
	}

}

  


運行結果為:

【java多線程與并發庫】---傳統java多線程<1>線程基本概念

總結:在Thread子類的run方法和傳遞給Thread的Runnable對象的run方法都被覆寫的時候,程序執行Thread子類的run方法。

問題二:如果Thread類的run方法沒有被覆寫,并且為Thread類傳遞的Runnable對象的run方法也編寫了運行代碼?那么程序會執行哪一個run方法呢?

總結:顯然是調用Runnable對象的run方法:實例二已經證明

下一篇將講述Thread的兩種創建方法

【java多線程與并發庫】---傳統java多線程<1>線程基本概念


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 97在线观免费视频观看 | 韩国日本三级在线观看 | 超清乱人伦中文视频在线 | 99热久久这里只精品国产9 | 国产原创麻豆精品视频 | 久久精品国产视频在热 | 国产91久久最新观看地址 | 免费网站毛片 | 亚洲va久久久久综合 | 国产嘿咻视频 | 天天干人人 | 华人欧美国产在线精品 | 国产或人精品日本亚洲77美色 | 日本成人不卡视频 | 欧美午夜在线观看理论片 | 欧美精品久久久久久久小说 | 成年人免费网址 | 乱子伦有声小说mp3 仑乱高清在线一级播放 | 国产网址在线观看 | 久久精品国产只有精品2020 | 99免费在线观看视频 | 男女精品视频 | 波多野结衣亚洲一区二区三区 | 国产一及毛片 | 中文国产日韩欧美视频 | 婷婷综合亚洲 | 亚洲另类伦春色综合妖色成人网 | 四虎影库网址 | 成人私人影院在线观看网址 | 欧美在线视频一区二区 | 久久99久久精品国产99热 | 国产日韩欧美亚洲精品95 | 香蕉视频黄网站 | 四虎黄色网 | 亚洲国产精品成人综合色在线婷婷 | 亚洲综合区 | 香蕉国产人午夜视频在线 | 精品福利在线视频 | 一级特黄aaa大片免费看 | 搡的我好爽视频在线观看 | 日本精品一区二区三区在线观看 |