设置线程当天十二点执行_这份JAVA多线程笔记真的是细节满满,几乎全是你工作能用到的干货...
前言
1:發(fā)揮多核CPU的優(yōu)勢(充分利用cpu資源)
如果是單線程的程序,那么在雙核CPU上就浪費(fèi)了50%,在4核CPU上就浪費(fèi)了75%。單核CPU上所謂的”多線程”那是假的多線程,同一時間處理器只會處理一段邏輯,只不過線程之間切換得比較快,看著像多個線程”同時”運(yùn)行罷了。多核CPU上的多線程才是真正的多線程,它能讓你的多段邏輯同時工作,多線程,可以真正發(fā)揮出多核CPU的優(yōu)勢來,達(dá)到充分利用CPU的目的。多線程完成cpu內(nèi)核的快速切換,提高CPU的利用率
2:防止阻塞
假如單線程執(zhí)行的時候在返回數(shù)據(jù)的時候遲遲沒有返回,然后此時線程就會出現(xiàn)阻塞 要是多線程的話,那么要是有一個阻塞了也不會影響其他線程的執(zhí)行單核CPU上運(yùn)行多線程導(dǎo)致線程上下文的切換,而降低程序整體的效率
3:便于建模
就是一個大任務(wù),拆分成多個小任務(wù),此時就十分簡單了
4:提高程序執(zhí)行效率
? 也就是上文中的利用多個線程用多核cpu的情況,可以在多核cpu的都在進(jìn)行工作沒有休息,就防止cup在休息然后不工作的情況
進(jìn)程和線程:
進(jìn)程:一個程序運(yùn)行的時候叫做進(jìn)程
線程:一個進(jìn)程啟動會有多個線程 最少有兩個線程(gc 和 主)
線程之間可以數(shù)據(jù)共享
并發(fā):在同一時間一起訪問線程(有可能出現(xiàn)異常)
并行:在同一時間段上一起訪問線程 必須多核 然后同時運(yùn)行
線程存在的意義:其實(shí)是為了提高進(jìn)程的效率 就是可以在同一時間開啟多個線程
線程的創(chuàng)建和啟動
兩種方式創(chuàng)建線程
1:繼承于Thread
-自定義繼承Thread
-復(fù)寫run方法
-創(chuàng)建自定義類對象
-自定義對象調(diào)用start方法
//繼承Thread類來自定義一個線程類 class MyThread extends Thread{//分配任務(wù) 來自于父類的方法public void run(){//方法寫在這里 線程執(zhí)行體System.out.println("聽音樂");}public static void main(String[] args){MyThread myThread = new MyThread();myThread.start(); //線程啟動 將當(dāng)前線程交給cup來調(diào)度//當(dāng)搶到cpu資源時,執(zhí)行其中run方法System.out.println("玩游戲");} }//此時代碼主線程先開啟 開啟執(zhí)行調(diào)用線程 此時線程數(shù)(3) //我們現(xiàn)在有 主線程 和cpu來決定誰搶到cpu資源 然后自定義和 //主線程就開始競爭資源了 誰搶到就是誰的了 注意:只有當(dāng)線程有競爭關(guān)系的時候才能體現(xiàn)出來 且不會因?yàn)橹骶€程的結(jié)束而結(jié)束當(dāng)前線程 只有在所有線程結(jié)束之后才會結(jié)束當(dāng)前線程2:實(shí)現(xiàn)Runable
-自定義實(shí)現(xiàn)Runnable接口
-覆寫run方法
-創(chuàng)建自定義類對象
-把自定義類的對象作為Thread對象的參數(shù)創(chuàng)建
(本質(zhì)就是用Thread的一個構(gòu)造器來創(chuàng)建一個啟動線程的方法)
-使用Thread類的對象調(diào)用start方法
創(chuàng)建Thread的時候傳入一個String的時候 其實(shí)就是為線程賦予名字 //編寫線程中需要執(zhí)行的方法 public MyRunnable implement Runnable{public void run(){//線程體 寫一個線程中要執(zhí)行的代碼for(int i = 0;i<10;i++){System.out.println("玩游戲);}} }public MyRunnableDemo{public static void main(String[] arge){//創(chuàng)建對象MyRunnable m = new Myrunnable();//傳入m代碼是 Thread執(zhí)行的任務(wù)為m內(nèi)run方法Thread t = new Thread(m);t.start();for(int i = 0;i<10;i++){System.out.println("聽音樂);}} }線程聲明周期的狀態(tài)
線程的開始 是在new的時候就開始了
1:可運(yùn)行 排隊(duì) 和執(zhí)行狀態(tài)
2:等待 等待另一個線程來喚醒他
3:計時等待 萬一沒人喚醒自己定時醒
4:阻塞狀態(tài) 遇到特俗情況(如IO) 讓出自己的cpu資源
5:終止 當(dāng)線程執(zhí)行完畢就結(jié)束了 也可以強(qiáng)停
常用方法
1:join 讓當(dāng)前線程執(zhí)行完畢 之后再執(zhí)行其他的線程
? 使其他資源讓出自己的資源
(同步 a完事之后 再執(zhí)行b)
(異步 a和b交替執(zhí)行 //平時的執(zhí)行方法)
2:sleep(long milllis) 計時等待 一般模擬網(wǎng)絡(luò)延遲
3:線程優(yōu)先級 可以提供他和其他線程搶cpu執(zhí)行的機(jī)會
但是不是絕對高 只是和cpu調(diào)用有關(guān) 1-10 默認(rèn)是5
Tread對象設(shè)置優(yōu)先級setPriority(int x)和 獲取getpriority()獲取優(yōu)先級
4:后臺線程 又名守護(hù)線程 守護(hù)其他的普通線程
所有的前臺線程此時后臺延遲自程死亡
setDaemon() 將當(dāng)前線程設(shè)置為后臺線程(不能再start后)
用Thread和Runnable創(chuàng)建線程區(qū)別
一:使用Thread方法創(chuàng)建線程
? 常用語法區(qū)別
1:super.getName(); //獲取當(dāng)前線程名字
2:設(shè)置獲取線程名字區(qū)別
? (1):線程名.setName("");
? (2):我們可以再構(gòu)造器中設(shè)置名字
? 子類中調(diào)用父類構(gòu)造器 再子類中提供一個構(gòu)造器 然后調(diào)用父類構(gòu)造器 此時就可以再測試類創(chuàng)建對象的時候直接初始化名字沒有必要再設(shè)置了 這種方式更加簡單;每個對象都會有一個成員變量值都是相等的 每次改變的都是自己的所以不能共享 此時我們把成員變量設(shè)置為靜態(tài)的成員 此時無論幾個對象都是訪問一個字段對象
二:使用Runnable方法,可以實(shí)現(xiàn)資源共享在啟動的時候需要多執(zhí)行一部
常用語法區(qū)別
1:Thread.currentThread().getName(); //獲取當(dāng)前線程名字
2:設(shè)置獲取線程的名字區(qū)別
? (1)通過Thread(Runnable run,String name); 可以傳入名字
? (2)new Thread(Runnabel run).setName();
實(shí)現(xiàn)資源 要不就是資源是大家的一起共有的 在不就是大家只有一個
synchronized同步
當(dāng)多個線程并發(fā)訪問同一個資源的時候,可能出現(xiàn)線程不安全的問題
就是一個線程在執(zhí)行的時候可能被其他線程搶走此時就出現(xiàn)錯誤了然后就
此時引入Synchronized哪一個線程拿到此鎖的時候就會在里面執(zhí)行并且把其他線程隔絕在外面
同步方法 //不需要我們自己指定鎖對象
//鎖對象 對于非static方法,同步鎖就是this 對于static方法,同步鎖就是當(dāng)前方法所在類的字解碼對象synchronized public void 方法名(){需要同步的方法體 } 注意:當(dāng)我們使用繼承的方法的時候 盡量使用靜態(tài)的鎖方法 如果使用非靜態(tài)的就會出現(xiàn)錯誤 因?yàn)閠his只是指向當(dāng)前對象 然后當(dāng)有多個對象的時候就會出現(xiàn)對象指向不明的問題同步代碼塊 //需要我們自己指定鎖對象
//鎖對象 保證使用同一個對象作為鎖對象即可 實(shí)現(xiàn)方式:鎖對象直接用this就好 因?yàn)橹挥幸粋€對象 synchronized(同步鎖對象插入位置一般為this){? 需要同步的代碼塊} 繼承方式:鎖對象就不能用this了 因?yàn)椴皇侵挥幸粋€對象 此時如何保證同一個對象 1:自定義線程對象.class 同一份字解碼對象 2:可以在自定義線程 讓一個對象代表三個/更多對象Objetc obj = new Object();注意:我們保證多個線程共用一個對象才可以 不然還是鎖不住,并且要盡量減少同步代碼塊的作用域.
原子性操作
:在執(zhí)行這段代碼的時候不要讓其他人進(jìn)來 關(guān)門操作一個或者幾個操作在一個線程執(zhí)行完畢之后,另一個線程才能開始執(zhí)行該操作
最后
感謝你看到這里,看完有什么的不懂的可以在評論區(qū)問我,覺得文章對你有幫助的話記得給我點(diǎn)個贊,每天都會分享java相關(guān)技術(shù)文章或行業(yè)資訊,歡迎大家關(guān)注和轉(zhuǎn)發(fā)文章!
總結(jié)
以上是生活随笔為你收集整理的设置线程当天十二点执行_这份JAVA多线程笔记真的是细节满满,几乎全是你工作能用到的干货...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iqooneo系统要不要更新_IQOOZ
- 下一篇: matlab里用fix函数,Matlab