Java線程代碼的實(shí)現(xiàn)方法
一、線程Java代碼實(shí)現(xiàn)
1.繼承Thread
聲明Thread的子類
public class MyThread extends Thread { public void run(){ System.out.println("MyThread running"); } }
運(yùn)行thread子類的方法
MyThread myThread = new MyThread(); myTread.start();
2.創(chuàng)建Thread的匿名子類
Thread thread = new Thread(){ public void run(){ System.out.println("Thread Running"); } }; thread.start();
3.實(shí)現(xiàn)Runnable接口
聲明
public class MyThread implements Runnable { @override public void run() { System.out.println("MyThread is running"); } }
運(yùn)行
Thread thread = new Thread(new MyRunnable()); thread.start();
4.創(chuàng)建實(shí)現(xiàn)Runnable接口的匿名類
new Thread(new Runnable(){ @override public void run() { System.out.println("Thread is running"); } }).start();
5.線程名字
創(chuàng)建時候可以給線程起名字
Thread thread = new Thread(new MyRunnable(),"name");?獲得名字 Thread thread = new Thread(new MyRunnable(),"name"); System.out.println(thraed.getName());?獲取運(yùn)行當(dāng)期代碼線程的名字 Thread.currentThread().getName();
二、線程安全性
1.定義
線程會共享進(jìn)程范圍內(nèi)的資源,同時,每個線程也會有各自的程序計(jì)數(shù)器,棧,以及局部變量。在多個線程不完全同步的情況下,多個線程執(zhí)行的順序是不可預(yù)測的,那么不同的執(zhí)行順序就可能帶來極其糟糕的結(jié)果。
如何定義一個類是線程安全的呢?最核心的問題在于正確性,在代碼中無需進(jìn)行額外的同步或者協(xié)同操作的情況下,無論有多少個線程使用這個類,無論環(huán)境以何種方式調(diào)度多線程,這個類總能表現(xiàn)出正確的行為,我們就成這個類是線程安全的。
2.線程類不安全的實(shí)例
1.首先定義Count類,有私有成員count=0;
public class Count { private long count = 0; public long getCount() { return count; } public void service() { count++; } }
2.然后在線程中去調(diào)用這個類的service方法
final Count count = new Count(); for (int i = 0; i < 20000; i++) { Thread thread3 = new Thread(){ @Override public void run() { count.service(); if (count.getCount() == 20000) { System.out.println("ahha"); } } }; thread3.start(); }
3.結(jié)果程序卻沒有輸出,說明最后count并沒有達(dá)到20000,為什么呢?
因?yàn)榇嬖谥韵洛e誤執(zhí)行的情況:線程2在線程1沒有完成count自增的情況下就讀取了count,導(dǎo)致最后count沒有達(dá)到20000。
4.并發(fā)編程中,這種由于不恰當(dāng)?shù)膱?zhí)行順序而顯示了不正確結(jié)果的情況叫做Race Condition(競爭狀態(tài)),這種情況出現(xiàn)的根本原因是count的自增沒有保持原子性。count自增分三步操作,而不是一步到位。
以上這篇Java線程代碼的實(shí)現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Flutter實(shí)現(xiàn)文本組件、圖標(biāo)及按鈕組件的代碼
這篇文章主要介紹了Flutter實(shí)現(xiàn)文本組件、圖標(biāo)及按鈕組件的代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-07-07SpringCloud集成MybatisPlus實(shí)現(xiàn)MySQL多數(shù)據(jù)源配置方法
本文詳細(xì)介紹了SpringCloud集成MybatisPlus實(shí)現(xiàn)MySQL多數(shù)據(jù)源配置的方法,包括在application.properties中配置多數(shù)據(jù)源,配置MybatisPlus,創(chuàng)建Mapper接口和使用多數(shù)據(jù)源等步驟,此外,還解釋了每一個配置項(xiàng)目的含義,以便讀者更好地理解和應(yīng)用2024-10-10Dwr3.0純注解(純Java Code配置)配置與應(yīng)用淺析三之后端反向調(diào)用前端
Dwr是為人所熟知的前端框架,其異步推送功能是為人所津津樂道的,下來主要研究一下它的這個功能是怎么應(yīng)用的;2016-04-04Java算法之時間復(fù)雜度和空間復(fù)雜度的概念和計(jì)算
這篇文章主要介紹了Java算法之時間復(fù)雜度和空間復(fù)雜度的概念和計(jì)算,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05java高并發(fā)下解決AtomicLong性能瓶頸方案LongAdder
這篇文章主要為大家介紹了java高并發(fā)下解決AtomicLong性能瓶頸方案LongAdder,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12java讀取配置文件(properties)的時候,unicode碼轉(zhuǎn)utf-8方式
這篇文章主要介紹了java讀取配置文件(properties)的時候,unicode碼轉(zhuǎn)utf-8方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02Java框架Struts2實(shí)現(xiàn)圖片上傳功能
這篇文章主要為大家詳細(xì)介紹了Java框架Struts2實(shí)現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08