Java線程代碼實現

来源:http://www.cnblogs.com/yanwenxiong/archive/2017/08/16/7376313.html
-Advertisement-
Play Games

線程實現和線程安全性 參考博客:(http://www.importnew.com/20672.html),參考書籍:《Java併發編程實戰》 一、線程Java代碼實現 1.繼承Thread + 聲明Thread的子類 + 運行thread子類的方法 2.創建Thread的匿名子類 3.實現Runn ...


線程實現和線程安全性

參考博客:(http://www.importnew.com/20672.html),參考書籍:《Java併發編程實戰》

一、線程Java代碼實現

1.繼承Thread

  • 聲明Thread的子類
public class MyThread extends Thread {
   public void run(){
     System.out.println("MyThread running");
   }
}
  • 運行thread子類的方法
MyThread myThread = new MyThread();
myTread.start();

2.創建Thread的匿名子類

Thread thread = new Thread(){
   public void run(){
     System.out.println("Thread Running");
   }
};
thread.start();

3.實現Runnable介面

  • 聲明

    public class MyThread implements Runnable {
    @override
    public void run() {
        System.out.println("MyThread is running");
    }
    }
  • 運行

Thread thread = new Thread(new MyRunnable());
thread.start();

4.創建實現Runnable介面的匿名類

new Thread(new Runnable(){
    @override
    public void run() {
        System.out.println("Thread is running");
    }
}).start();

5.線程名字

  • 創建時候可以給線程起名字
Thread thread = new Thread(new MyRunnable(),"name");
  • 獲得名字
Thread thread = new Thread(new MyRunnable(),"name");
System.out.println(thraed.getName());
  • 獲取運行當期代碼線程的名字
Thread.currentThread().getName();

二、線程安全性

1.定義

    線程會共用進程範圍內的資源,同時,每個線程也會有各自的程式計數器,棧,以及局部變數。在多個線程不完全同步的情況下,多個線程執行的順序是不可預測的,那麼不同的執行順序就可能帶來極其糟糕的結果。

    如何定義一個類是線程安全的呢?最核心的問題在於正確性,在代碼中無需進行額外的同步或者協同操作的情況下,無論有多少個線程使用這個類,無論環境以何種方式調度多線程,這個類總能表現出正確的行為,我們就成這個類是線程安全的。

2.線程類不安全的實例

  • 1.首先定義Count類,有私有成員count=0;
public class Count {
    private long count = 0;
    
    public long getCount() {
        return count;
    }
    
    public void service() {
        count++;
    }
}
  • 2.然後線上程中去調用這個類的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.結果程式卻沒有輸出,說明最後count並沒有達到20000,為什麼呢?
    因為存在著以下錯誤執行的情況:線程2線上程1沒有完成count自增的情況下就讀取了count,導致最後count沒有達到20000。
    image

  • 4.併發編程中,這種由於不恰當的執行順序而顯示了不正確結果的情況叫做Race Condition(競爭狀態),這種情況出現的根本原因是count的自增沒有保持原子性。count自增分三步操作,而不是一步到位。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 領域對象:Game(游戲), Room(游戲群),兩者一對多的關係,SQL語句中會用到JOIN 通常用Dapper的Query<TFirst,TSecond,TReturn>() 或 QueryAsync<TFirst,TSecond,TReturn>() 是可以實現,但是去除重覆記錄比較麻煩。 所 ...
  • 一般是訪問https時才出現“508 Loop Detected”,idhttp+IdSSLIOHandlerSocketOpenSSL,這個在上篇文章中講過了。 由於該問題網上資料極少,連外文資料也沒卵用,起初我也以為是idhttp的重定向設置問題,但確認過沒設置錯。 不過相比https,http ...
  • 出現這種問題的原因是由於訪問的 URL地址為https或存在其跳轉地址為https。 首先單純使用idhttp是只能訪問http,而https則需要搭配IdSSLIOHandlerSocketOpenSSL來實現對https的訪問支持,當然還需要在系統目錄或編譯目標程式的同目錄下有ssleay32. ...
  • 安裝好環境後,開始了第一個Hello word 例子,如何讀取圖片,保存圖品 每天學習一點點,睡覺去了。 ...
  • 以前學過點 面向對象的知識,我感覺這之間是有關聯的,比如說裝飾器的第一個要素是對被裝飾的函數的封閉性,不允許更改;第二個就是對裝飾器本oj身的可擴展性。 裝飾器要點:高階函數+嵌套函數=裝飾器 需要掌握的知識點:1、函數即變數 2、高階函數(函數的參數也是函數) 3、嵌套函數 裝飾器一:裝飾器不帶參 ...
  • 今天寫這個是為了 提醒自己 編程過程 不僅要有邏輯 思想 還有要規範 代碼 這樣可讀性 感謝我牛神提供的文檔 1、PHP 編程規範與編碼習慣最主要的有以下幾點: 1 文件說明 2 function 函數體說明 3 代碼縮進 4 if省略 5 變數規範 6 命名規範 7 十行一註釋 8 註釋風格 9 ...
  • 虛擬機類載入機制 一、類載入的階段和時機 1.階段 整個生命周期包括:載入(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)7個階段。 其中驗證、準 ...
  • 通過set()獲取兩個數組的交/並/差集: ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...