Java 線程基本知識

来源:http://www.cnblogs.com/liyuhui-Z/archive/2017/10/22/7712650.html
-Advertisement-
Play Games

線程 線程和進程 進程 : 進程指正在運行的程式。確切的來說,當一個程式進入記憶體運行,即變成一個進程,進程是處於運行過程中的程式,並且具有一定獨立功能。 線程 : 線程是進程中的一個執行單元(執行路徑),負責當前進程中程式的執行,一個進程中至少有一個線程。一個進程中是可以有多個線程的,這個應用程式也 ...


線程

線程和進程

進程 : 進程指正在運行的程式。確切的來說,當一個程式進入記憶體運行,即變成一個進程,進程是處於運行過程中的程式,並且具有一定獨立功能。

線程 : 線程是進程中的一個執行單元(執行路徑),負責當前進程中程式的執行,一個進程中至少有一個線程。一個進程中是可以有多個線程的,這個應用程式也可以稱之為多線程程式。

線程是程式執行流的最小單

實現線程

繼承Thread類並且重寫run方法

啟動線程的時候需要使用的方法是start() 不能直接調用run()方法

主要方法

- start() 啟動線程

- Thread.currentThread() 獲取當前線程

- getName()    獲取線程名字

- Thread.sleep(long m)   讓當前線程停止m毫秒

示例

public class ThreadDemo extends Thread {
    public static void main(String[] args) {
        ThreadDemo demo = new ThreadDemo();
        demo.start();  // 需要啟用start() 並不是直接調用run方法
        for (int i = 0; i < 5000; i++) {
            System.out.println("you are ok");
        }
    }
    @Override
    public void run() {
        for (int i = 0; i < 5000; i++) {
            System.out.println("張含笑最美");
        }

    }
}    

實現Runnable介面,並且實現run()方法

Runnable介面中只設定了一個run()方法,所以要啟用線程需要new 一個Thread 然後再其構造方法內傳遞Runnable

因為單繼承多實現的原則,避免了單繼承的局限性,繼承介面的實現了線程對象和線程任務的分離,有利於解耦

示例

```
        public class RunnableDemo implements Runnable {
            public static void main(String[] args) {
                 RunnableDemo demo = new RunnableDemo();
                 Thread th = new Thread(demo);
                 th.start();
            }
        
            @Override
            public void run() {
                for (int i = 1; i < 2000; i++) {
                    System.out.println(1);
                }
            }
        }
```

匿名內部類

示例

```
        new Thread(){
            public void run(){
                System.out.println("run1");
            }
        }.start();
        
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("run2");
            }
        }).start();

```

線程池

開闢一塊記憶體空間,裡面存放了眾多(未死亡)的線程,池中線程執行調度由池管理器來處理。當有線程任務時,從池中取一個,執行完成後線程對象歸池,這樣可以避免反覆創建線程對象所帶來的性能開銷,節省了系統的資源。

線程池可以調用實現Callable介面的類,

  • Callable 和 Runnable

    • Runnable 和 Callable 都代表那些要在不同的線程中執行的任務

    • Runnable 從 JDK1.0 開始就有了,Callable 是在 JDK1.5 增加的。

    • 它們的主要區別是 Callable 的 call() 方法可以返回值和拋出異常,而 Runnable 的 run() 方法沒有這些功能。

    • Callable 只可以通過線程池來調用,而不可以通過Thread類來調用

Java提供五種線程池 // 這五種線程池都可以通過Executors來調用方法創建

  • newFixedThreadPool 創建固定大小的線程池,每次提交一個任務就創建一個線程,直到線程達到線程池的最大大小,線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那麼線程池會補充一個新線程。

  • newCachedThreadPool 創建一個可緩存線程池,如果現有線程沒有可用的,則創建一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。因此,長時間保持空閑的線程池不會使用任何資源。

  • newSingleThreadExecutor 創建是一個單線程池,也就是該線程池只有一個線程在工作,它相當於newFixedThreadPool方法是傳入的參數為1

  • newScheduledThreadPool 創建一個大小無限的線程池,此線程池支持定時以及周期性執行任務的需求。

  • newSingleThreadScheduledExecutor 創建一個單線程化的支持定時的線程池,可以用一個線程周期性執行任務(比如周期7天,一次任務才用1小時,使用多線程就會浪費資源)

示例

        ExecutorService pool = Executors.newFixedThreadPool(2);
        submit() 傳遞的為線程類
        Future<String> future = pool.submit(new ThreadCallback(5));
        Future<String> future2 = pool.submit(new ThreadCallback(50));
        System.out.println(future.get());
        System.out.println(future2.get());

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

-Advertisement-
Play Games
更多相關文章
  • .NET後臺代碼利用QQ郵箱伺服器發送郵件遇到的問題: "mail from address must be same as authorization user" 首先,看下我的代碼實現 後臺代碼: 配置文件: 代碼已經搞定,剩下的就是跑起來了 第一次跑起來遇到問題就是開頭所說的 "mail fr ...
  • “System.NullReferenceException”類型的異常在 App_Web_2tjb2nqh.dll 中發生,但未在用戶代碼中進行處理 問題原因: 項目中添加了ListBox1控制項, 但: ListBox1中未設置預設值,造成該欄位的值為空,因資料庫該欄位不允許為空,造成程式報錯所致 ...
  • 很多情況下基於wcf的複雜均衡都首選zookeeper,這樣可以擁有更好的控制粒度,但zk對C# 不大友好,實現起來相對來說比較麻煩,實際情況下,如果 你的負載機制粒度很粗糙的話,優先使用nginx就可以搞定,既可以實現複雜均衡,又可以實現雙機熱備,以最小的代碼量實現我們的業務,下麵具體分享下。 一 ...
  • Session Session在ASP.NET中,表示客戶端(Goggle,Firefox,IE等)與伺服器端的會話,用來存儲特定會話信息,準確來說,是用來存儲特定用戶信息。當客戶端向伺服器發送一個請求時,如登陸用戶ID,伺服器接收到該請求,伺服器端Session產生一個與該登陸用戶相關的Sessi ...
  • css代碼 背景與前景 background-color:#0000; 背景色,樣式表優先順序高 background-image:url(路徑); 設置背景圖片 background-attachment:fixed; 背景固定,不隨字體滾動 background-attachment:scroll ...
  • Visual Studio 2017 於2017年10月13日發佈 15.4 版本。該版本包含多項生產力改進,支持 .NET Standard 2.0 ,並且可以開啟 Xamarin Live Play 預覽了。具體的發行信息,可以查看 Visual Studio 2017 Version 15.4 ...
  • 本內容有版許可權制,僅提供學習交流參考等等,請勿隨便轉載或者代碼商用。 1 /** layui-v2.1.5 MIT License By http://www.layui.com */; 2 layui.define(["layer", "laytpl", "upload"], function ( ...
  • 這是一個神奇的組件,通過名字我們可以看出來,這個組件的功能就是把model和form組合起來,對,你沒猜錯,相信自己的英語水平。 先來一個簡單的例子來看一下這個東西怎麼用: 比如我們的資料庫中有這樣一張學生表,欄位有姓名,年齡,愛好,郵箱,電話,住址,註冊時間等等一大堆信息,現在讓你寫一個創建學生的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...