Java 有关于线程
線程:是進(jìn)程中的一個(gè)執(zhí)行場(chǎng)景,也就是執(zhí)行流程
啟動(dòng)一個(gè)進(jìn)程相當(dāng)于啟動(dòng)一個(gè)應(yīng)用程序
進(jìn)程和進(jìn)程之間的內(nèi)存是獨(dú)立的
一個(gè)進(jìn)程可以啟用多個(gè)線程
單進(jìn)程:只能做一件事
多線程:為了提高應(yīng)用程序的使用率
例:人可以用電腦邊玩游戲邊聽(tīng)音樂(lè),給人感覺(jué)玩游戲和聽(tīng)音樂(lè)是在同一時(shí)間點(diǎn)進(jìn)行,其實(shí)不是,只是游戲進(jìn)程和音樂(lè)進(jìn)程頻繁切換得很快,給人的一種錯(cuò)覺(jué)
Java程序的運(yùn)行原理:
Java命令會(huì)啟動(dòng)Java虛擬機(jī),等于啟動(dòng)一個(gè)應(yīng)用程序,也就是啟動(dòng)一個(gè)進(jìn)程,該進(jìn)程會(huì)自動(dòng)啟動(dòng)一個(gè)主線程,這個(gè)主線程會(huì)自動(dòng)調(diào)用某個(gè)類(lèi)的main方法
?
線程的創(chuàng)建和啟動(dòng):
1.繼承Thread類(lèi) ( java.lang )
1) 定義線程,繼承線程Thread類(lèi)并重寫(xiě)run方法
2) 創(chuàng)建線程
3) 啟動(dòng)線程
2.實(shí)現(xiàn)Runable接口
1) 定義線程,繼承線程Runable類(lèi)并重寫(xiě)run方法
2) 創(chuàng)建線程
3) 啟動(dòng)線程
?
線程的調(diào)度與控制
分時(shí)調(diào)度模型:所有線程輪流使用cpu的使用權(quán),使用時(shí)間相等
搶占式調(diào)度模型(Java使用的是搶占式調(diào)度模型)
?
線程的優(yōu)先級(jí)
線程的優(yōu)先級(jí)高,那個(gè)線程拿到CPU的使用權(quán)機(jī)率大
?
setName():改變線程的名字
?
線程的同步(加鎖)
異步線程模型
t1,t2線程,兩個(gè)線程運(yùn)行時(shí)互不影響
同步線程模型
t1線程 必須等到 t2線程 運(yùn)行結(jié)束后才能執(zhí)行
最主要是考慮線程的安全 [ 數(shù)據(jù)的安全(共享數(shù)據(jù)的安全) ]
?
面試題:
使用Thread類(lèi)和實(shí)現(xiàn)runable接口的異同點(diǎn):
?
?
例:
1 package hello1; 2 3 //定義一個(gè)線程 繼承Thread類(lèi) 4 public class ThreadA extends Thread{ 5 //重寫(xiě)run()方法 6 @Override 7 public void run(){ 8 for(int i=0;i<20;i++){ 9 System.out.println("ThreadA..run.."+i); 10 } 11 } 12 } 1 package hello1; 2 3 //重寫(xiě)的方法不能拋出比原方法所拋出的異常類(lèi)型更寬泛 4 //實(shí)現(xiàn)runable接口 5 public class ThreadB implements Runable{ 6 @Override 7 public void run(){ 8 Thread t=Thread.currentThread(); 9 for(int i=0;i<10;i++){12 13 / * try{ 14 Thread.sleep(1000); 15 }catch(InterruptedException e){ 16 e.printStackTrace(); 17 } * / 18 System.out.println(""+t.getName()+"..."+i); 19 } 20 } 21} 1 package hello1;2 public classTestMAin{ 3 public static void main(String[] ages){ 4 //創(chuàng)建線程 5 Thread t=new ThreadA(); 6 Thread t1=new Thread(new ThreadB()); 7 //setName():改變線程的名字 8 t1.setName("t1"); 9 10 //setPriority():改變線程優(yōu)先級(jí);設(shè)置t1線程的優(yōu)先級(jí)最高 11 t1.setPriority(10); 12 13 //啟動(dòng)線程(調(diào)用start()方法時(shí),會(huì)自動(dòng)調(diào)用run()方法) 14 t.start(); //結(jié)果不定,用到多線程,在t線程中運(yùn)行 15 t1.start(); 16 //t.run(); //結(jié)果:先run后main;只是一個(gè)普通方法的調(diào)用,沒(méi)有用到多線程 17 18 System.out.println("最高優(yōu)先級(jí):"+Thread.MAX_PRIORITY); 19 System.out.println("默認(rèn)優(yōu)先級(jí):"+Thread.NORM_PRIORITY); 20 System.out.println("最低優(yōu)先級(jí):"+Thread.MIN_PRIORITY); 21 22 //這段代碼是在主線程運(yùn)行的 23 /* 24 for(int i=0;i<10;i++){ 25 System.out.println("TestMain..ThreadA..main.." + i); 26 } 27 28 for(int i=0;i<10;i++){ 29 System.out.println("TestMain..ThreadB..main.." + i); 30 } 31 */ 32 } 34 }
輸出結(jié)果:
因?yàn)樵O(shè)置了“?t1.setPriority(10); ”,所以ThreadB..比ThreadA..先輸出
?
但如果設(shè)置“?Thread.sleep(1000);?”,即ThreadB延遲1000毫秒輸出,這個(gè)就跟線程的狀態(tài)有關(guān)了,你設(shè)置了sleep就等于將當(dāng)前線程掛起1000MS,這個(gè)跟線程優(yōu)先級(jí)無(wú)關(guān),當(dāng)時(shí)間到了以后,再執(zhí)行。
?而只設(shè)置優(yōu)先級(jí)的話,那等于是t1和t2線程只要產(chǎn)生沖突,那么被掛起的永遠(yuǎn)是優(yōu)先級(jí)低的那個(gè)。只要你其中的一個(gè)線程睡眠,他就會(huì)執(zhí)行另一個(gè),因此會(huì)交替出現(xiàn)
?
1000MS=1s(1000毫秒=1秒)
小知識(shí)點(diǎn):
類(lèi)是單繼承,默認(rèn)是包可訪問(wèn),方法默認(rèn)是可以覆蓋(Override)的,static,final,abstract等修飾語(yǔ)的含義也很清晰。
轉(zhuǎn)載于:https://www.cnblogs.com/chenyuan7/p/7954681.html
總結(jié)
以上是生活随笔為你收集整理的Java 有关于线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: hdu 1496 Equations(技
- 下一篇: eclipse的操作
