當前位置:首頁 » 編程語言 » java多線程執行任務

java多線程執行任務

發布時間: 2022-05-16 07:49:13

java中,線程是什麼意思,多線程又是什麼

在計算機中當一個程序運行的時候就會創建至少一個進程,例如當我們運行QQ的時候,系統就會創建進程來處理我們平時的一些操作,當我們打開任務管理器的時候,在進程的列表裡面就可以找到QQ.exe的運行程序;

在計算機中處理進程之外還有另一個概念就是線程,線程是存在於進程當中,一個進程可以包含多個線程;當我們的計算機有多核處理器的時候,使用多線程可以加快程序的運算速率;如果一個進程中只有一個線程,當程序遇到一個比較耗時的計算的時候,由於程序是單線程的,那麼程序只能等待這個運算結束的時候再繼續運行,這樣會大大的降低程序的效率;當時用多個線程的時候,在某個線程遇到比較耗時的運算的時候,該線程可以繼續自己的運算,但是其他的線程也可以同步進行,這樣當耗時的計算結束之後,其他線程也將自己所需要的東西執行完畢,這樣就會很大的提高程序執行效率;

在程序運行中對於文件的保存相對於處理器的運算速度來說是很慢的,當我們程序中接收到一個保存文件的信息之後,我們可以創建一個保存文件的線程,在主線程中我們可以繼續進行我們的其他運算,這樣當文件保存好之後,我們的其他運算也會完成,互不影響;

在Java中我們可以創建一個自己的類繼承於Thread類,並且重寫run() 方法,當線程啟動之後,run()方法裡面的操作都在線程中進行處理,而不會影響主線程的信息;

當我們創建好一個自定義線程類之後,我們可以創建這個自定義線程的對象,進行線程的啟動;線程須調用start();方法進行啟動,這樣run()方法裡面的內容才會在線程中運行;如果我們不去調用start()方法,那我們只是創建了一個普通的類,即使我們手動調用run()方法,run()方法裡面的內容也不會在線程中運行;

在Java中線程主要有初始狀態,運行狀態,阻塞狀態,終止狀態等;當我們新創建一個線程對象的時候,此時線程的狀態為初始狀態;當我們調用start()之後,此時的線程才被激活成為運行狀態,之後run()方法裡面的信息才會在子線程中運行;我們可以在不同的階段調用不同的方法將線程設置為不同的狀態;比如有時候我們的操作需要等待其他線程中運算結束之後才可以繼續進行,這時候我們就可以將線程設置為等待狀態,當需要的資源滿足條件之後,可以繼續運行當前的線程;

以上的內容就是關於Java中線程是什麼,更多關於Java方面的問題可以看下這個視頻教程:網頁鏈接,希望我的回答能幫到你。

② java 多線程怎麼深入

並發與並行

並行,表示兩個線程同時做事情。

並發,表示一會做這個事情,一會做另一個事情,存在著調度。單核 CPU 不可能存在並行(微觀上)。

image

以上就是原生線程池創建的核心原理。除了原生線程池之外並發包還提供了簡單的創建方式,上面也說了它們是對原生線程池的一種包裝,可以讓開發者簡單快捷的創建所需要的線程池。

Executors

newSingleThreadExecutor

創建一個線程的線程池,在這個線程池中始終只有一個線程存在。如果線程池中的線程因為異常問題退出,那麼會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。

newFixedThreadPool

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

newCachedThreadPool

可根據實際情況,調整線程數量的線程池,線程池中的線程數量不確定,如果有空閑線程會優先選擇空閑線程,如果沒有空閑線程並且此時有任務提交會創建新的線程。在正常開發中並不推薦這個線程池,因為在極端情況下,會因為 newCachedThreadPool 創建過多線程而耗盡 CPU 和內存資源。

newScheledThreadPool

此線程池可以指定固定數量的線程來周期性的去執行。比如通過 scheleAtFixedRate 或者 scheleWithFixedDelay 來指定周期時間。

PS:另外在寫定時任務時(如果不用 Quartz 框架),最好採用這種線程池來做,因為它可以保證裡面始終是存在活的線程的。

推薦使用 ThreadPoolExecutor 方式

在阿里的 Java 開發手冊時有一條是不推薦使用 Executors 去創建,而是推薦去使用 ThreadPoolExecutor 來創建線程池。

這樣做的目的主要原因是:使用 Executors 創建線程池不會傳入核心參數,而是採用的默認值,這樣的話我們往往會忽略掉裡面參數的含義,如果業務場景要求比較苛刻的話,存在資源耗盡的風險;另外採用 ThreadPoolExecutor 的方式可以讓我們更加清楚地了解線程池的運行規則,不管是面試還是對技術成長都有莫大的好處。

改了變數,其他線程可以立即知道。保證可見性的方法有以下幾種:

  • volatile

  • 加入 volatile 關鍵字的變數在進行匯編時會多出一個 lock 前綴指令,這個前綴指令相當於一個內存屏障,內存屏障可以保證內存操作的順序。當聲明為 volatile 的變數進行寫操作時,那麼這個變數需要將數據寫到主內存中。

    由於處理器會實現緩存一致性協議,所以寫到主內存後會導致其他處理器的緩存無效,也就是線程工作內存無效,需要從主內存中重新刷新數據。

    ③ java多線程任務一般開多少個線程

    一個線程是只能執行一個任務,多個任務需要多線程處理。
    多線程將多任務的思想拓展到應用,因此,您可以將單個應用中的特定步驟進一步分解成一個個線程,每個線程可以並行運行。操作系統不僅在不同的應用任務間分配處理時間,而且在一項應用的每個線程間分配處理時間。

    工程與科學方面的應用程序通常運行於專用的系統(可能沒有多任務化)。而一個多線程NI LabVIEW程序可以被分解成四個線程:用戶界面、數據採集、網路通信以及數據錄入。您可以分別賦予這四個線程的優先順序,以便它們獨立工作。於是,在多線程應用中,多項任務可以與該系統執行的其他應用並行執行。
    利用多線程的應用具有以下幾大優勢:
    1更有效的CPU利用率
    2更好的系統可靠性
    3改善多處理器計算機的性能

    在許多應用中,您同步地調用資源,如儀器,這些儀器調用時常需要較長的時間完成。在一個單線程應用中,一個同步調用可能會阻止或防止該應用中的其他任務執行,直至該操作完成。而多線程避免了這樣的情況出現。
    當同步調用在一個線程中運行時,程序中不依賴於該調用的其它部分可以在其它線程中運行。該程序的執行可以持續地推進,而不是停滯直到完成同步調用。這樣,一個多線程應用實現了CPU使用效率的最大化,因為當該應用的所有線程都可以同時運行時,CPU不會處於空閑狀態。

    ④ java 一個線程處理多個任務

    一個線程是只能執行一個任務,多個任務需要多線程處理。

    多線程將多任務的思想拓展到應用,因此,您可以將單個應用中的特定步驟進一步分解成一個個線程,每個線程可以並行運行。操作系統不僅在不同的應用任務間分配處理時間,而且在一項應用的每個線程間分配處理時間。

    工程與科學方面的應用程序通常運行於專用的系統(可能沒有多任務化)。而一個多線程NI LabVIEW程序可以被分解成四個線程:用戶界面、數據採集、網路通信以及數據錄入。您可以分別賦予這四個線程的優先順序,以便它們獨立工作。於是,在多線程應用中,多項任務可以與該系統執行的其他應用並行執行。

    利用多線程的應用具有以下幾大優勢:

    1. 更有效的CPU利用率

    2. 更好的系統可靠性

    3. 改善多處理器計算機的性能

    在許多應用中,您同步地調用資源,如儀器,這些儀器調用時常需要較長的時間完成。在一個單線程應用中,一個同步調用可能會阻止或防止該應用中的其他任務執行,直至該操作完成。而多線程避免了這樣的情況出現。

    當同步調用在一個線程中運行時,程序中不依賴於該調用的其它部分可以在其它線程中運行。該程序的執行可以持續地推進,而不是停滯直到完成同步調用。這樣,一個多線程應用實現了CPU使用效率的最大化,因為當該應用的所有線程都可以同時運行時,CPU不會處於空閑狀態。

    ⑤ 什麼是JAVA的多線程

    簡單,先回答什麼是線程:即程序的執行路徑,再回答多線程:多線程就是一個程序中有多條不同的執行路徑

    JAVA多線程的優點:可以並發的執行多項任務,比如說你瀏覽網頁的同時還可以聽歌

    ⑥ JAVA中如何利用多線程同時運行多個方法

    首先,這個同時,只是在宏觀上的,多線程環境,線程與線程之間,還是串列運行的。
    要「同時」運行多個方法,那麼,就需要創建多個線程,然後,在線程的run()方法里,寫上你想要實現的邏輯。需如果創建多線程,這又是另一個問題(通過繼承Thread跟實現Runnable來實現)。

    ⑦ java的多線程有哪些實現方式

    有三種:
    (1)繼承Thread類,重寫run函數
    創建:
    class xx extends Thread{
    public void run(){
    Thread.sleep(1000) //線程休眠1000毫秒,sleep使線程進入Block狀態,並釋放資源
    }}
    開啟線程:
    對象.start() //啟動線程,run函數運行
    (2)實現Runnable介面,重寫run函數
    開啟線程:
    Thread t = new Thread(對象) //創建線程對象
    t.start()
    (3)實現Callable介面,重寫call函數
    Callable是類似於Runnable的介面,實現Callable介面的類和實現Runnable的類都是可被其它線程執行的任務。
    Callable和Runnable有幾點不同:
    ①Callable規定的方法是call(),而Runnable規定的方法是run().
    ②Callable的任務執行後可返回值,而Runnable的任務是不能返回值的
    ③call()方法可拋出異常,而run()方法是不能拋出異常的。
    ④運行Callable任務可拿到一個Future對象,Future表示非同步計算的結果。它提供了檢查計算是否完成的方法,以等
    待計算的完成,並檢索計算的結果.通過Future對象可了解任務執行情況,可取消任務的執行,還可獲取任務執行的結果

    ⑧ java如何在多線程執行完後才執行其他任務

    java.util.concurrent.CountDownLatch 這個類可以實現你所要的功能

    例如:CountDownLatch latch = new CountDownLatch(5) //聲明計數器為5個
    Thread t = new Thread() {
    public void run() {
    try {
    //TODO 你的應用
    } catch (Exception e) {
    //TODO 異常處理
    }
    finally {
    latch.countDown(); //這句是關鍵
    System.out.println("ok"); //5個線程都跑完後輸出
    }
    }
    };
    t.start();
    然後讓以上操作循環五次(就是說同時開5個線程),那麼這個"ok"就會在等到這5個線程都ok後才會被輸出一次。

    ⑨ java 多線程是什麼

    進程是程序在處理機中的一次運行。一個進程既包括其所要執行的指令,也包括了執行指令所需的系統資源,不同進程所佔用的系統資源相對獨立。所以進程是重量級的任務,它們之間的通信和轉換都需要操作系統付出較大的開銷。

    線程是進程中的一個實體,是被系統獨立調度和分派的基本單位。線程自己基本上不擁有系統資源,但它可以與同屬一個進程的其他線程共享進程所擁有的全部資源。所以線程是輕量級的任務,它們之間的通信和轉換只需要較小的系統開銷。

    Java支持多線程編程,因此用Java編寫的應用程序可以同時執行多個任務。Java的多線程機制使用起來非常方便,用戶只需關注程序細節的實現,而不用擔心後台的多任務系統。

    Java語言里,線程表現為線程類。Thread線程類封裝了所有需要的線程操作控制。在設計程序時,必須很清晰地區分開線程對象和運行線程,可以將線程對象看作是運行線程的控制面板。在線程對象里有很多方法來控制一個線程是否運行,睡眠,掛起或停止。線程類是控制線程行為的唯一的手段。一旦一個Java程序啟動後,就已經有一個線程在運行。可通過調用Thread.currentThread方法來查看當前運行的是哪一個線程。

    ⑩ java多線程的任務執行問題。

    先調用
    shutdown
    在調用
    isTerminated
    例:
    /*
    * 採用線程池開啟多個子線程,主線程等待所有的子線程執行完畢
    */
    public static void moreThread() {
    try {
    int threadNum = 0;
    for (int i = 0; i < 10; i++) {
    threadNum++;

    final int currentThreadNum = threadNum;
    exe.execute(new Runnable() {

    @Override
    public void run() {
    try {
    System.out.println("子線程[" + currentThreadNum + "]開啟");
    Thread.sleep(1000*10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }finally{
    System.out.println("子線程[" + currentThreadNum + "]結束");
    }
    }
    });
    }

    System.out.println("已經開啟所有的子線程");
    exe.shutdown();
    System.out.println("shutdown():啟動一次順序關閉,執行以前提交的任務,但不接受新任務。");
    while(true){
    if(exe.isTerminated()){
    System.out.println("所有的子線程都結束了!");
    break;
    }
    Thread.sleep(1000);
    }

    } catch (InterruptedException e) {
    e.printStackTrace();
    }finally{
    System.out.println("主線程結束");
    }
    }

    熱點內容
    trimsql 發布:2024-03-29 23:29:13 瀏覽:691
    編程自學書 發布:2024-03-29 23:29:08 瀏覽:377
    qq密碼在qq哪裡能看見 發布:2024-03-29 23:29:06 瀏覽:214
    楚雄琪豐酒店wifi密碼多少 發布:2024-03-29 23:20:10 瀏覽:509
    自招編程題 發布:2024-03-29 23:19:31 瀏覽:192
    蘋果端的什麼游戲與安卓數據互通 發布:2024-03-29 23:18:23 瀏覽:695
    androidwear表盤 發布:2024-03-29 23:09:46 瀏覽:833
    19萬的紅旗有哪些配置 發布:2024-03-29 23:09:44 瀏覽:985
    裝修公司網站源碼 發布:2024-03-29 23:01:45 瀏覽:454
    安卓手機哪個有nfc功能 發布:2024-03-29 22:59:25 瀏覽:554