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