多線程編程java,多線程編程題

本文目錄一覽:

java 多線程是什麼?

線程定義比較抽象,簡單的說就是一個代碼執行流。許多執行流可以混合在一起由CPU調度。線程是允許各種任務交互執行的方式。

Java的線程在操作系統的實現模式依系統不同而不同,可能是系統級別的進程或線程,但對於程序員來說並沒有影響。

任務交互的一個好處是增加程序響應。如一個界面程序執行一段耗時的數據庫查詢,使用單獨的線程可以讓界面依然響應用戶的其他輸入,而單線程只能等待查詢結束再處理。

JVM以及操作系統會優先處理優先級別高的線程,但不代表這些線程一定會先完成。設定優先級只能建議系統更快的處理,而不能強制。

另外,在運行時,並沒有按照函數分界,而是按照機器碼/彙編碼分界。也就是說不保證任何一段代碼是被完整而不打斷的執行的(除非你已經使用同步手段)。正由於如此,各種線程同步的方法應運而生。

java多線程編程中涉及的基礎知識點?

線程設計在軟件開發領域中是非常常見的一個設計構成,今天昆明北大青鳥就一起來了解一下,java多線程編程中都涉及到了哪些基礎知識點。

順序

用於表示多個操作“依次處理”。比如把十個操作交給一個人來處理時,這個人要一個一個地按順序來處理

並行

用於標識多個操作“同時處理”。比如十個操作分給兩個人處理時,這兩個人就會並行來處理。

並發

相對於順序和並行來說比較抽象,用於表示“將一個操作分割成多個部分並且允許無序處理”。比如將十個操作分成相對獨立的兩類,這樣便能夠開始並發處理了。如果一個人來處理,這個人就是順序處理分開的並發操作,而如果是兩個人,這兩個人就可以並行處理同一個操作。

總結

多線程程序都是並發處理的。如果CPU只有一個,那麼並發處理就是順序執行的,而如果有多個CPU,那麼並發處理就可能會並行運行。

等待隊列

所有實例都擁有一個等待隊列,它是在實例的wait方法執行後停止操作的線程隊列。就好比為每個實例準備的線程休息室

在執行wait方法後,線程便會暫停操作,進入等待隊列這個休息室。除非發生下列某一情況,否則線程會一直在等待隊列中休眠。

有其他線程的notify方法來喚醒線程

有其他線程的notifyAll方法來喚醒線程

有其他線程的interrupt方法來喚醒線程

wait方法超時

notify方法

該方法會將等待隊列中的一個線程去除。同wait方法一樣,若要執行notify方法,線程也必須持有要調用的實例的鎖。

notifyAll方法

notify方法僅喚醒一個線程,而notifyAll則喚醒所有線程,這是兩者之間的區別

同wait方法和notify方法一樣,notifyAll方法也只能由持有要調用的實例鎖的線程調用

notify和notifyAll選擇

notify方法和notifyAll方法非常相似,到底該使用哪個?

實際上,這很難選擇,由於notify喚醒的線程較少,所以處理速度要比使用notifyAll時快。但使用notify時,如果處理不好,程序便可能會停止。一般來說,使用notifyAll時的代碼要比使用notify時的更為健壯。

什麼是多線程編程

多線程編程技術是Java語言的重要特點。多線程編程的含義是將程序任務分成幾個並行的子任務。特別是在網絡編程中,你會發現很多功能是可以並發執行的。比如網絡傳輸速度較慢、用戶輸入速度較慢,你可以用兩個獨立的線程去完成這兩個功能,而不影響正常的顯示或其它功能。多線程是與單線程比較而言的,普通的Windows採用單線程程序結構,其工作原理是:主程序有一個消息循環,不斷從消息隊列中讀入消息來決定下一步所要乾的事情,一般是針對一個函數,只有等這個函數執行完之後,主程序才能接收另外的消息來執行。比如子函數功能是在讀一個網絡數據,或讀一個文件,只有等讀完這個數據或文件才能接收下一個消息。在執行這個子函數過程中你什麼也不能幹。但往往讀網絡數據和等待用戶輸入有很多時間處於等待狀態,多線程利用這個特點將任務分成多個並發任務後,就可以解決這個問題。Java中的線程類1.擴展java.lang.Thread類,用它覆蓋Thread類的run方法。2.生成實現java.lang.Runnable接口的類並將其它的實例與java.lang.Thread實例相關聯。Thread類是負責向其它類提供線程支持的最主要的類,要使用一個類具有線程功能,在Java中只要簡單地從Thread類派生一個子類就可以了擴展Thread類,如printThread.java。Thread類最重要的方法是run方法。run方法是新線程執行的方法,因此生成java.lang.Thread的子類時,必須有相應的run方法。//PrintThread.javapublic class PrintThread extends Thread//繼承Tread類private int count=0//定義一個count變量用於統計打印的次數並共享變量public static void mainString args//main方法開始PrintThread p=new PrintThread//創建一個線程實例p.start//執行線程for{;;}//主線程main方法執行一個循環,for執行一個死循環count++System.out.printcount+″:Main\n″//主線程中打印count+“main”變量的值,並換行public void run//線程類必須有的run()方法for{;;}count++System.out.printcount+″:Thread\n″上面這段程序便是繼承java.lang.Tread並覆蓋run的方法。用Java虛擬機啟動程序時,這個程序會先生成一個線程並調用程序主類的main方法。這個程序中的main方法生成新線程,連接打印“Thread”。在啟動線程之後,主線程繼續打印“Main”。編譯並執行這個程序,然後立即按“Ctrl+C”鍵中斷程序,你會看到上面所述的兩個線程不斷打印出:XXX:main…..XXX:Thread….XXX代表的是數字,也就是上面count的值。在筆者的機器上,不同時刻這兩個線程打印的次數不一樣,先打印20個main(也就是先執行20次主線程)再打印出50次Thread,然後再打印main……提示:為了便於查看該程序的執行結果,你可以將執行結果導入一個文本文件,然後打開這個文件查看各線程執行的情況。如運行:javac PrintThread.javaJava PrintThread1.txt第一個命令javacPrintThread.java是編譯java程序,第二個是執行該程序並將結果導入1.txt文件。當然你可以直接執行命令:java

java 多線程是什麼?一個處理器怎麼同時處理多個程序

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

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

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

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

class ThreadTest{

public static void main(String args[]){

Thread t = Thread.currentThread();

t.setName(“單線程”); //對線程取名為”單線程”

t.setPriority(8);

//設置線程優先級為8,最高為10,最低為1,默認為5

System.out.println(“The running thread: ” + t);

// 顯示線程信息

try{

for(int i=0;i3;i++){

System.out.println(“Sleep time ” + i);

Thread.sleep(100); // 睡眠100毫秒

}

}catch(InterruptedException e){// 捕獲異常

System.out.println(“thread has wrong”);

}

}

}

多線程的實現方法

繼承Thread類

可通過繼承Thread類並重寫其中的run()方法來定義線程體以實現線程的具體行為,然後創建該子類的對象以創建線程。

在繼承Thread類的子類ThreadSubclassName中重寫run()方法來定義線程體的一般格式為:

public class ThreadSubclassName extends Thread{

public ThreadSubclassName(){

….. // 編寫子類的構造方法,可缺省

}

public void run(){

….. // 編寫自己的線程代碼

}

}

用定義的線程子類ThreadSubclassName創建線程對象的一般格式為:

ThreadSubclassName ThreadObject =

new ThreadSubclassName();

然後,就可啟動該線程對象表示的線程:

ThreadObject.start(); //啟動線程

應用繼承類Thread的方法實現多線程的程序。本程序創建了三個單獨的線程,它們分別打印自己的“Hello World!”。

class ThreadDemo extends Thread{

private String whoami;

private int delay;

public ThreadDemo(String s,int d){

whoami=s;

delay=d;

}

public void run(){

try{

sleep(delay);

}catch(InterruptedException e){ }

System.out.println(“Hello World!” + whoami

+ ” ” + delay);

}

}

public class MultiThread{

public static void main(String args[]){

ThreadDemo t1,t2,t3;

t1 = new ThreadDemo(“Thread1”,

(int)(Math.random()*2000));

t2 = new ThreadDemo(“Thread2”,

(int)(Math.random()*2000));

t3 = new ThreadDemo(“Thread3”,

(int)(Math.random()*2000));

t1.start();

t2.start();

t3.start();

}

}

實現Runnable接口

編寫多線程程序的另一種的方法是實現Runnable接口。在一個類中實現Runnable接口(以後稱實現Runnable接口的類為Runnable類),並在該類中定義run()方法,然後用帶有Runnable參數的Thread類構造方法創建線程。

創建線程對象可用下面的兩個步驟來完成:

(1)生成Runnable類ClassName的對象

ClassName RunnableObject = new ClassName();

(2)用帶有Runnable參數的Thread類構造方法創建線程對象。新創建的線程的指針將指向Runnable類的實例。用該Runnable類的實例為線程提供 run()方法—線程體。

Thread ThreadObject = new Thread(RunnableObject);

然後,就可啟動線程對象ThreadObject表示的線程:

ThreadObject.start();

在Thread類中帶有Runnable接口的構造方法有:

public Thread(Runnable target);

public Thread(Runnable target, String name);

public Thread(String name);

public Thread(ThreadGroup group,Runnable target);

public Thread(ThreadGroup group,Runnable target,

String name);

其中,參數Runnable target表示該線程執行時運行target的run()方法,String name以指定名字構造線程,ThreadGroup group表示創建線程組。

用Runnable接口實現的多線程。

class TwoThread implements Runnable{

TwoThread(){

Thread t1 = Thread.currentThread();

t1.setName(“第一主線程”);

System.out.println(“正在運行的線程: ” + t1);

Thread t2 = new Thread(this,”第二線程”);

System.out.println(“創建第二線程”);

t2.start();

try{

System.out.println(“第一線程休眠”);

Thread.sleep(3000);

}catch(InterruptedException e){

System.out.println(“第一線程有錯”);

}

System.out.println(“第一線程退出”);

}

public void run(){

try{

for(int i = 0;i 5;i++){

System.out.println(“第二線程的休眠時間:”

+ i);

Thread.sleep(1000);

}

}catch(InterruptedException e){

System.out.println(“線程有錯”);

}

System.out.println(“第二線程退出”);

}

public static void main(String args[]){

new TwoThread();

}

}

程序運行結果如下:

正在運行的線程: Thread[第一主線程,5,main

創建第二線程

第一線程休眠

第二線程的休眠時間:0

第二線程的休眠時間:1

第二線程的休眠時間:2

第一線程退出

第二線程的休眠時間:3

第二線程的休眠時間:4

第二線程退出

至於一個處理器同時處理多個程序,其實不是同時運行多個程序的,簡單的說,如果是單核的CPU,在運行多個程序的時候其實是每個程序輪流佔用CPU的,只是每個程序佔用的時間很短,所以我們人為的感覺是“同時”運行多個程序。

多線程的java 程序如何編寫?

Java 給多線程編程提供了內置的支持。 一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。

新建狀態:

使用 new 關鍵字和 Thread 類或其子類建立一個線程對象後,該線程對象就處於新建狀態。它保持這個狀態直到程序 start() 這個線程。

就緒狀態:

當線程對象調用了start()方法之後,該線程就進入就緒狀態。就緒狀態的線程處於就緒隊列中,要等待JVM里線程調度器的調度。

運行狀態:

如果就緒狀態的線程獲取 CPU 資源,就可以執行 run(),此時線程便處於運行狀態。處於運行狀態的線程最為複雜,它可以變為阻塞狀態、就緒狀態和死亡狀態。

阻塞狀態:

如果一個線程執行了sleep(睡眠)、suspend(掛起)等方法,失去所佔用資源之後,該線程就從運行狀態進入阻塞狀態。在睡眠時間已到或獲得設備資源後可以重新進入就緒狀態。可以分為三種:

等待阻塞:運行狀態中的線程執行 wait() 方法,使線程進入到等待阻塞狀態。

同步阻塞:線程在獲取 synchronized 同步鎖失敗(因為同步鎖被其他線程佔用)。

其他阻塞:通過調用線程的 sleep() 或 join() 發出了 I/O 請求時,線程就會進入到阻塞狀態。當sleep() 狀態超時,join() 等待線程終止或超時,或者 I/O 處理完畢,線程重新轉入就緒狀態。

死亡狀態:

一個運行狀態的線程完成任務或者其他終止條件發生時,該線程就切換到終止狀態。

什麼是Java多線程編程?

一、 什麼是多線程:

我們現在所使用操作系統都是多任務操作系統(早期使用的DOS操作系統為單任務操作系統),多任務操作指在同一時刻可以同時做多件事(可以同時執行多個程序)。

多進程:每個程序都是一個進程,在操作系統中可以同時執行多個程序,多進程的目的是為了有效的使用CPU資源,每開一個進程系統要為該進程分配相關的系統資源(內存資源)

多線程:線程是進程內部比進程更小的執行單元(執行流|程序片段),每個線程完成一個任務,每個進程內部包含了多個線程每個線程做自己的事情,在進程中的所有線程共享該進程的資源;

主線程:在進程中至少存在一個主線程,其他子線程都由主線程開啟,主線程不一定在其他線程結束後結束,有可能在其他線程結束前結束。Java中的主線程是main線程,是Java的main函數;

二、 Java中實現多線程的方式:

繼承Thread類來實現多線程:

當我們自定義的類繼承Thread類後,該類就為一個線程類,該類為一個獨立的執行單元,線程代碼必須編寫在run()方法中,run方法是由Thread類定義,我們自己寫的線程類必須重寫run方法。

run方法中定義的代碼為線程代碼,但run方法不能直接調用,如果直接調用並沒有開啟新的線程而是將run方法交給調用的線程執行

要開啟新的線程需要調用Thread類的start()方法,該方法自動開啟一個新的線程並自動執行run方法中的內容

請點擊輸入圖片描述

結果:

請點擊輸入圖片描述

java多線程的啟動順序不一定是線程執行的順序,各個線程之間是搶佔CPU資源執行的,所有有可能出現與啟動順序不一致的情況。

CPU的調用策略:

如何使用CPU資源是由操作系統來決定的,但操作系統只能決定CPU的使用策略不能控制實際獲得CPU執行權的程序。

線程執行有兩種方式:

1.搶佔式:

目前PC機中使用最多的一種方式,線程搶佔CPU的執行權,當一個線程搶到CPU的資源後並不是一直執行到此線程執行結束,而是執行一個時間片後讓出CPU資源,此時同其他線程再次搶佔CPU資源獲得執行權。

2.輪循式;

每個線程執行固定的時間片後讓出CPU資源,以此循環執行每個線程執行相同的時間片後讓出CPU資源交給下一個線程執行。

希望對您有所幫助!~

原創文章,作者:WFMQX,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/328938.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WFMQX的頭像WFMQX
上一篇 2025-01-14 18:54
下一篇 2025-01-14 18:54

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論