本文目錄一覽:
- 1、JAVA怎麼處理線程池中線程的並發問題?
- 2、java並發(1)線程模型
- 3、java中多線程地並發運行是什麼意思?有什麼作用.好處?
- 4、java多線程並發的問題
- 5、java多線程並發去調用一個類的靜態方法,有什麼問題?
JAVA怎麼處理線程池中線程的並發問題?
可以通過以下原則解決:
1、設置線程池的最大線程數
2、設置線程池的並發處理線程數量
3、設置線程池最大的隊列線程數
4、做好線程池的線程清理工作
做好這幾點,理論上沒問題了,具體還得看編程者代碼的質量。
PS:服務器不可能為每一個請求都創建線程,得考慮到最大負載,當達到臨界值的時候,服務器返回繁忙狀態,拒絕服務即可,當然這是簡單的處理辦法。
java並發(1)線程模型
程序並不能單獨運行,只有將程序裝載到內存中,系統為它分配資源才能運行,而這種執行的程序就稱之為進程。程序和進程的區別就在於:程序是指令的集合,它是進程運行的靜態描述文本;進程是程序的一次執行活動,屬於動態概念
主要歸咎於兩點. 一個是由實現決定的,一個是由需求決定的.
線程由線程ID,程序計數器(PC)[用於指向內存中的程序指令],寄存器集合[由於存放本地變量和臨時變量]和堆棧[用於存放方法指令和方法參數等]組成。
以 Unix/Linux 的體系架構為例。
因為操作系統的資源是有限的,如果訪問資源的操作過多,必然會消耗過多的資源,而且如果不對這些操作加以區分,很可能造成資源訪問的衝突。所以,為了減少有限資源的訪問和使用衝突,對不同的操作賦予不同的執行等級(有多大能力做多大的事),用戶態(User Mode)和內核態(Kernel Mode)。
運行於用戶態的進程可以執行的操作和訪問的資源都會受到極大的限制,而運行在內核態的進程則可以執行任何操作並且在資源的使用上沒有限制。
並發 :一個時間段內有很多的線程或進程在執行,但何時間點上都只有一個在執行,多個線程或進程爭搶時間片輪流執行。
並行 :一個時間段和時間點上都有多個線程或進程在執行。
線程有三種模型, 一對一,多對一,多對多.具體參考 一篇文章讀懂Java多線程模型 , 這裡只描述一對一的情況.
每個用戶線程都映射到一個內核線程,每個線程都成為一個獨立的調度單元,由內核調度器獨立調度,一個線程的阻塞不會影響到其他線程,從而保障整個進程繼續工作.
JVM 沒有限定 Java 線程需要使用哪種線程模型來實現, JVM 只是封裝了底層操作系統的差異,而不同的操作系統可能使用不同的線程模型,例如 Linux 和 windows 可能使用了一對一模型,solaris 和 unix 某些版本可能使用多對多模型。所以一談到 Java 語言的多線程模型,需要針對具體 JVM 實現。
Sun JDK 1.2開始,線程模型都是基於操作系統原生線程模型來實現,它的 Window 版和 Linux 版都是使用系統的 1:1 的線程模型實現的。
java中多線程地並發運行是什麼意思?有什麼作用.好處?
如果並發的線程數量很多,並且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,因為頻繁創建線程和銷毀線程需要時間。因此我們可以用多線程處理並發運行,提高資源利用率;
舉例
假如有一個工廠,工廠裏面有10個工人,每個工人同時只能做一件任務。
因此只要當10個工人中有工人是空閑的,來了任務就分配給空閑的工人做;
當10個工人都有任務在做時,如果還來了任務,就把任務進行排隊等待;
如果說新任務數目增長的速度遠遠大於工人做任務的速度,那麼此時工廠主管可能會想補救措施,比如重新招4個臨時工人進來;
然後就將任務也分配給這4個臨時工人做;
如果說著14個工人做任務的速度還是不夠,此時工廠主管可能就要考慮不再接收新的任務或者拋棄前面的一些任務了。
當這14個工人當中有人空閑時,而新任務增長的速度又比較緩慢,工廠主管可能就考慮辭掉4個臨時工了,只保持原來的10個工人,畢竟請額外的工人是要花錢的。
java多線程並發的問題
回答這個問題需要先弄清楚線程的概念和線程的生命周期。
線程:是指程序代碼的一次執行,是動態的過程。樓主在定義OneTh這個實現Runnable接口類的時候肯定複寫了他的run()方法。onet1和onet2是兩個線程,也就是說雖然他們的run()方法相同,但是是執行了兩次的。
計算機中CPU的調度過程:現在的電腦看上去能同時實現多任務,像是一邊上QQ,一邊聽音樂,還可以一邊上網。但計算機中的CPU只有一個,它沒有分身術,不可能真正意義上實現同時運行這麼多程序。而是採用了一種時間片輪轉的方式,為每個應用程序賦予極短的時間,然後高速的在不同的程序間切換,至於每次切換到那個程序,這個要由CPU和線程的優先級來決定。
線程的生命周期:創建時是初始化了這個線程,調用start方法時,是讓這個線程進入了可運行狀態,注意是可運行,不是正在運行。就像上面說的,在某一時刻CPU具體要運行誰是由CPU和線程的優先級決定的。當線程被CPU運行時,就會開始執行run方法,但可能執行到一半時,CPU又被其他可運行線程搶走,而只能暫停執行。
JAVA程序線程的運行:在我們使用java命令來運行程序時,這時候已經開始了兩個線程,一個是main()方法的線程,一個是垃圾回收的線程。當樓主調用start方法開啟另外兩個線程時。這時候由於CPU來決定運行哪個線程。所以雖然noet1是先開啟的,但在執行noet1時,CPU可能又去跑去執行main線程了,然後就會開啟onet2.
還有我覺得主線程結束了,只不過其他兩個線程仍在繼續運行。所以會打印出結果。
樓主如果還有什麼不明白的話可以繼續問或者相互討論。
java多線程並發去調用一個類的靜態方法,有什麼問題?
總的結論:java是線程安全的,即對任何方法(包括靜態方法)都可以不考慮線程衝突,但有一個前提,就是不能存在全局變量。如果存在全局變量,則需要使用同步機制。\x0d\x0a\x0d\x0a如下通過一組對比例子從頭講解:\x0d\x0a 在多線程中使用靜態方法會發生什麼事?也就是說多線程訪問同一個類的static靜態方法會發生什麼事?是否會發生線程安全問題?\x0d\x0apublic class Test {\x0d\x0a public static void operation(){\x0d\x0a // … do something\x0d\x0a }\x0d\x0a}\x0d\x0a 事實證明只要在靜態函數中沒有處理多線程共享數據,就不存在着多線程訪問同一個靜態方法會出現資源衝突的問題。下面看一個例子:\x0d\x0apublic class StaticThread implements Runnable {\x0d\x0a @Override\x0d\x0a public void run() {\x0d\x0a // TODO Auto-generated method stub\x0d\x0a StaticAction.print();\x0d\x0a }\x0d\x0a public static void main(String[] args) {\x0d\x0a for (int i = 0; i
回答於 2022-12-11
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/236820.html