日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

【java多線程與并發(fā)庫(kù)】---傳統(tǒng)java多線程<1>線

系統(tǒng) 2039 0

一. 線程的基本概念

1 、入題: 我們大家都知道,我們可以在一臺(tái)計(jì)算機(jī)上同時(shí)聊天,看電影,下載視頻等,完成上述任務(wù)的各個(gè)程序之間是完全相互獨(dú)立的。但是他們?cè)谕欢螘r(shí)間內(nèi)又同時(shí)處于運(yùn)行狀態(tài)。當(dāng)然呢,它們?cè)谶@一段時(shí)間內(nèi)是分時(shí)使用計(jì)算機(jī) CPU 時(shí)間的。只不過(guò)呢在 CPU 處理速度很快,劃分的時(shí)間片段很短,所以給大家感覺(jué)上是多個(gè)程序在同時(shí)運(yùn)行。

2 、進(jìn)程:

進(jìn)程是程序的一次動(dòng)態(tài)執(zhí)行過(guò)程。這個(gè)過(guò)程包含了從程序代碼從硬盤加載到內(nèi)存、在內(nèi)存中執(zhí)行、執(zhí)行結(jié)束等過(guò)程,實(shí)際上也就是進(jìn)程的產(chǎn)生、發(fā)展、消亡的一個(gè)過(guò)程。

另外,每個(gè)進(jìn)程都有自己的獨(dú)立的地址空間和占用的系統(tǒng)資源,在進(jìn)程執(zhí)行結(jié)束后,進(jìn)程會(huì)釋放系統(tǒng)資源還給系統(tǒng),供其他程序使用。

3 、線程:

線程是比進(jìn)程更小的一個(gè)執(zhí)行單位,它是一段完成特定功能的代碼 。

一個(gè)進(jìn)程中可以包含多個(gè)線程。

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

4 java 多線程:

一個(gè)進(jìn)程中可以同時(shí)運(yùn)行多個(gè)線程,每個(gè)線程執(zhí)行不同的任務(wù)。

5 、多線程的好處:

通過(guò)多線程程序設(shè)計(jì),就可以將程序任務(wù)劃分成幾個(gè)并行執(zhí)行的子任務(wù),從而提高整個(gè)程序的執(zhí)行效率和系統(tǒng)資源的利用率

二. 線程的創(chuàng)建方式

線程 是程序中的執(zhí)行線程。Java 虛擬機(jī)允許應(yīng)用程序并發(fā)地運(yùn)行多個(gè)執(zhí)行線程。

每個(gè)線程都有一個(gè)優(yōu)先級(jí),高優(yōu)先級(jí)線程的執(zhí)行優(yōu)先于低優(yōu)先級(jí)線程。每個(gè)線程都可以或不可以標(biāo)記為一個(gè)守護(hù)程序。當(dāng)某個(gè)線程中運(yùn)行的代碼創(chuàng)建一個(gè)新 Thread 對(duì)象時(shí),該新線程的初始優(yōu)先級(jí)被設(shè)定為創(chuàng)建線程的優(yōu)先級(jí),并且當(dāng)且僅當(dāng)創(chuàng)建線程是守護(hù)線程時(shí),新線程才是守護(hù)程序。

當(dāng) Java 虛擬機(jī)啟動(dòng)時(shí),通常都會(huì)有單個(gè)非守護(hù)線程(它通常會(huì)調(diào)用某個(gè)指定類的 main 方法)。Java 虛擬機(jī)會(huì)繼續(xù)執(zhí)行線程,直到下列任一情況出現(xiàn)時(shí)為止:

  • 調(diào)用了 Runtime 類的 exit 方法,并且安全管理器允許退出操作發(fā)生。
  • 非守護(hù)線程的所有線程都已停止運(yùn)行,無(wú)論是通過(guò)從對(duì) run 方法的調(diào)用中返回,還是通過(guò)拋出一個(gè)傳播到 run 方法之外的異常

Thread類的其中的兩個(gè)構(gòu)造方法

Thread ()
分配新的 Thread 對(duì)象。

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

實(shí)例一:在Thread子類覆蓋的run方法中編寫運(yùn)行代碼:

    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,線程由運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài),阻塞時(shí)間單位是毫秒
							//sleep()方法是靜態(tài)的,不需要特定的Thread對(duì)象就可以調(diào)用它,注意會(huì)拋出異常
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						System.out.println("thread:"+Thread.currentThread().getName());//打印當(dāng)前線程的名字
						System.out.println("2:"+this.getName());
						i++;
					}
				}
			};
			//調(diào)用start方法啟動(dòng)線程:用戶不能直接調(diào)用Thread類中的run方法,而是需要調(diào)用start方法間接調(diào)用run方法。
			
			/*   Thread中run方法的definition
			 
			  public void run() {
					if (target != null) {
					    target.run();
					}
    			}
			  
			 */
			thread.start();
  


運(yùn)行結(jié)果:

【java多線程與并發(fā)庫(kù)】---傳統(tǒng)java多線程<1>線程基本概念

實(shí)例二:在傳遞給Thread類的Runnable對(duì)象的run方法中編寫運(yùn)行代碼

    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,線程由運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài),阻塞時(shí)間單位是毫秒
							//sleep()方法是靜態(tài)的,不需要特定的Thread對(duì)象就可以調(diào)用它,注意會(huì)拋出異常
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						System.out.println("thread:"+Thread.currentThread().getName());//打印當(dāng)前線程的名字
						System.out.println("2:"+this.getName());
						i++;
					}
				}
			};
			//調(diào)用start方法啟動(dòng)線程:用戶不能直接調(diào)用Thread類中的run方法,而是需要調(diào)用start方法間接調(diào)用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,線程由運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài),阻塞時(shí)間單位是毫秒
							//sleep()方法是靜態(tài)的,不需要特定的Thread對(duì)象就可以調(diào)用它,注意會(huì)拋出異常
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						System.out.println("thread2:"+Thread.currentThread().getName());//打印當(dāng)前線程的名字
						
						i++;
					}
				}
			});
			thread2.start();
			
	}

}

  


運(yùn)行結(jié)果:

【java多線程與并發(fā)庫(kù)】---傳統(tǒng)java多線程<1>線程基本概念

那么大家可以思考這樣兩個(gè)問(wèn)題:

問(wèn)題一、如果Thread類的run方法被覆寫了,并且為Thread類傳遞的Runnable對(duì)象的run方法也編寫了運(yùn)行代碼?那么程序會(huì)執(zhí)行哪一個(gè)run方法呢?

實(shí)例三:來(lái)說(shuō)明上述問(wèn)題

    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,線程由運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài),阻塞時(shí)間單位是毫秒
								//sleep()方法是靜態(tài)的,不需要特定的Thread對(duì)象就可以調(diào)用它,注意會(huì)拋出異常
								Thread.sleep(1000);
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							System.out.println("Runnable:"+Thread.currentThread().getName());//打印當(dāng)前線程的名字
							
							i++;
						}
					}
				}		
			){
				public void run(){ //覆寫Thread類的run方法
					int i = 0;
					while(i<5){
						try {
							//使線程休眠1s,線程由運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài),阻塞時(shí)間單位是毫秒
							//sleep()方法是靜態(tài)的,不需要特定的Thread對(duì)象就可以調(diào)用它,注意會(huì)拋出異常
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						System.out.println("thread:"+Thread.currentThread().getName());//打印當(dāng)前線程的名字
						
						i++;
					}
				}
			}.start();
			
	}

}

  


運(yùn)行結(jié)果為:

【java多線程與并發(fā)庫(kù)】---傳統(tǒng)java多線程<1>線程基本概念

總結(jié):在Thread子類的run方法和傳遞給Thread的Runnable對(duì)象的run方法都被覆寫的時(shí)候,程序執(zhí)行Thread子類的run方法。

問(wèn)題二:如果Thread類的run方法沒(méi)有被覆寫,并且為Thread類傳遞的Runnable對(duì)象的run方法也編寫了運(yùn)行代碼?那么程序會(huì)執(zhí)行哪一個(gè)run方法呢?

總結(jié):顯然是調(diào)用Runnable對(duì)象的run方法:實(shí)例二已經(jīng)證明

下一篇將講述Thread的兩種創(chuàng)建方法

【java多線程與并發(fā)庫(kù)】---傳統(tǒng)java多線程<1>線程基本概念


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!??!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 滦南县| 通化市| 惠水县| 田东县| 麻城市| 文昌市| 固镇县| 岳池县| 蓬莱市| 合肥市| 得荣县| 本溪市| 通化市| 图们市| 武陟县| 青田县| 保康县| 永和县| 盐山县| 万全县| 皋兰县| 德安县| 永州市| 比如县| 开原市| 裕民县| 深水埗区| 新兴县| 临湘市| 上虞市| 汝州市| 九龙城区| 永寿县| 琼海市| 蚌埠市| 郁南县| 珲春市| 皮山县| 宜兰市| 正镶白旗| 兴化市|