java多線程學習
㈠ 如何深刻理解java多線程
線程是系統調度中的最小單位,因為其擁有比進程更小的資源消耗,因此,在進行同類事情,需要進行互相的通訊等等事情的時候,都採用線程來進行處理。
對於只做固定的一件事情(比如:計算1+2+3+...+9999999)來說,其性能上不會比採用單線程的整體效率高,原因是,同時都是要做這么多運算,採用多線程的話,系統在進行線程調度的過程中喙浪費一些資源和時間,從而性能上下降。
那麼,多線程是否就沒有存在的意義了呢?答案當然不是的。多線程還是有存在的價值的,我們在寫輸入流輸出流,寫網路程序等等的時候,都會出現阻塞的情況,如果說,我們不使用多線程的話,從A中讀數據出來的時候,A因為沒有準備好,而整個程序阻塞了,其他的任何事情都沒法進行。如果採用多線程的話,你就不用擔心這個問題了。還舉個例子:游戲中,如果A角色和B角色採用同一個線程來處理的話,那麼,很有可能就會出現只會響應A角色的操作,而B角色就始終被佔用了的情況,這樣,玩起來肯定就沒勁了。
因此,線程是有用的,但也不是隨便亂用,亂用的話,可能造成性能的低下,它是有一點的適用范圍的,一般我認為:需要響應多個人的事情,從設計上需要考慮同時做一些事情(這些事情很多情況下可能一點關系都沒有,也有可能有一些關系的)。
使用多線程的時候,如果某些線程之間涉及到資源共享、互相通訊等等問題的時候,一定得注意線程安全的問題,根據情況看是不是需要使用synchronized關鍵字。
㈡ 如何掌握java多線程,高並發,大數據方面的技能
總是看見有部分sb要回答你不能好好回答。不知道你丫能不能閉嘴?
多線程+並發,看java並發編程詳解,90%以上會java多線程的程序員都從這本書上學的。要考慮高並發,深刻理解多線程,並發,只有java的知識不夠,需要看操作系統核心編程之類的書籍,前提得會c編寫邊做邊理解。操作系統底層給它扒個底朝天。java的多線程是基於操作系統的,換句話說java的多線程依賴操作系統的多線程實現。操作系統核心編程(windows)或操作系統高級編程(unix系的)會把操作系統的運行原理說得很透徹,當然包括線程。
除了上面的知識,還需要深刻了解tcp/ip協議以及套接字編程,以及常用的tcp,udp,sctp的應用,如http,ftp,smtp,pop3,rpc等等應用級協議。
大數據需要資料庫支撐,資料庫的先會吧!這個一班不重要。大數據著塊重要的功能是如何,使用分析海量數據提取有用信息。需要針對不同領域做分析使用。比如一個氣象數據,對賣空調、賣冰箱的人他們關心啥,要能提供對應的數據給他們。對賣服裝的人,他們又關心啥?要提供哪些數據給他們?對農名,他們又關心啥,要提供哪些數據給他們?說大底。大數據所關心的問題是如何提供有效服務(掙錢點),需要了解很多具體行業知識。
(處理大數據的程序,略過,真不是太難的事,你學得懂第二,第三段描述的內容,要理解大數據的一些代碼架構實現不難)
㈢ 求教Java多線程 該怎麼入門
加上睡眠時間 列印一次睡一秒。列印50次 耗時太短 所以看不出來的
劑要交替噴施~次。防治蚜蟲可選用%吡
㈣ 怎麼學習java多線程
熟悉多線程的實現
了解多線程的各種狀態
㈤ 如何學習java中的多線程
幾乎所有使用 AWT 或 Swing 編寫的畫圖程序都需要多線程。但多線程程序會造成許多困難,剛開始編程的開發者常常會發現他們被一些問題所折磨,例如不正確的程序行為或死鎖。
在本文中,我們將探討使用多線程時遇到的問題,並提出那些常見陷阱的解決方案。
線程是什麼?
一個程序或進程能夠包含多個線程,這些線程可以根據程序的代碼執行相應的指令。多線程看上去似乎在並行執行它們各自的工作,就像在一台計算機上運行著多個處理機一樣。在多處理機計算機上實現多線程時,它們確實可以並行工作。和進程不同的是,線程共享地址空間。也就是說,多個線程能夠讀寫相同的變數或數據結構。
編寫多線程程序時,你必須注意每個線程是否干擾了其他線程的工作。可以將程序看作一個辦公室,如果不需要共享辦公室資源或與其他人交流,所有職員就會獨立並行地工作。某個職員若要和其他人交談,當且僅當該職員在「聽」且他們兩說同樣的語言。此外,只有在復印機空閑且處於可用狀態(沒有僅完成一半的復印工作,沒有紙張阻塞等問題)時,職員才能夠使用它。在這篇文章中你將看到,在 Java 程序中互相協作的線程就好像是在一個組織良好的機構中工作的職員。
在多線程程序中,線程可以從准備就緒隊列中得到,並在可獲得的系統 CPU 上運行。操作系統可以將線程從處理器移到准備就緒隊列或阻塞隊列中,這種情況可以認為是處理器「掛起」了該線程。同樣,Java 虛擬機 (JVM) 也可以控制線程的移動??在協作或搶先模型中??從准備就緒隊列中將進程移到處理器中,於是該線程就可以開始執行它的程序代碼。
協作式線程模型允許線程自己決定什麼時候放棄處理器來等待其他的線程。程序開發員可以精確地決定某個線程何時會被其他線程掛起,允許它們與對方有效地合作。缺點在於某些惡意或是寫得不好的線程會消耗所有可獲得的 CPU 時間,導致其他線程「飢餓」。
在搶占式線程模型中,操作系統可以在任何時候打斷線程。通常會在它運行了一段時間(就是所謂的一個時間片)後才打斷它。這樣的結果自然是沒有線程能夠不公平地長時間霸佔處理器。然而,隨時可能打斷線程就會給程序開發員帶來其他麻煩。同樣使用辦公室的例子,假設某個職員搶在另一人前使用復印機,但列印工作在未完成的時候離開了,另一人接著使用復印機時,該復印機上可能就還有先前那名職員留下來的資料。搶占式線程模型要求線程正確共享資源,協作式模型卻要求線程共享執行時間。由於 JVM 規范並沒有特別規定線程模型,Java 開發員必須編寫可在兩種模型上正確運行的程序。在了解線程以及線程間通訊的一些方面之後,我們可以看到如何為這兩種模型設計程序。
線程和 Java 語言
為了使用 Java 語言創建線程,你可以生成一個 Thread 類(或其子類)的對象,並給這個對象發送 start() 消息。(程序可以向任何一個派生自 Runnable 介面的類對象發送 start() 消息。)每個線程動作的定義包含在該線程對象的 run() 方法中。run 方法就相當於傳統程序中的 main() 方法;線程會持續運行,直到 run() 返回為止,此時該線程便死了。
上鎖
大多數應用程序要求線程互相通信來同步它們的動作。在 Java 程序中最簡單實現同步的方法就是上鎖。為了防止同時訪問共享資源,線程在使用資源的前後可以給該資源上鎖和開鎖。假想給復印機上鎖,任一時刻只有一個職員擁有鑰匙。若沒有鑰匙就不能使用復印機。給共享變數上鎖就使得 Java 線程能夠快速方便地通信和同步。某個線程若給一個對象上了鎖,就可以知道沒有其他線程能夠訪問該對象。即使在搶占式模型中,其他線程也不能夠訪問此對象,直到上鎖的線程被喚醒、完成工作並開鎖。那些試圖訪問一個上鎖對象的線程通常會進入睡眠狀態,直到上鎖的線程開鎖。一旦鎖被打開,這些睡眠進程就會被喚醒並移到准備就緒隊列中。
在 Java 編程中,所有的對象都有鎖。線程可以使用 synchronized 關鍵字來獲得鎖。在任一時刻對於給定的類的實例,方法或同步的代碼塊只能被一個線程執行。這是因為代碼在執行之前要求獲得對象的鎖。繼續我們關於復印機的比喻,為了避免復印沖突,我們可以簡單地對復印資源實行同步。如同下列的代碼例子,任一時刻只允許一位職員使用復印資源。通過使用方法(在 Copier 對象中)來修改復印機狀態。這個方法就是同步方法。只有一個線程能夠執行一個 Copier 對象中同步代碼,因此那些需要使用 Copier 對象的職員就必須排隊等候。
class CopyMachine {
public synchronized void makeCopies(Document d, int nCopies) {
//only one thread executes this at a time
}
public void loadPaper() {
//multiple threads could access this at once!
synchronized(this) {
//only one thread accesses this at a time
//feel free to use shared resources, overwrite members, etc.
}
}
}
Fine-grain 鎖
在對象級使用鎖通常是一種比較粗糙的方法。為什麼要將整個對象都上鎖,而不允許其他線程短暫地使用對象中其他同步方法來訪問共享資源?如果一個對象擁有多個資源,就不需要只為了讓一個線程使用其中一部分資源,就將所有線程都鎖在外面。由於每個對象都有鎖,可以如下所示使用虛擬對象來上鎖:
class FineGrainLock {
MyMemberClass x, y;
Object xlock = new Object(), ylock = new Object();
public void foo() {
synchronized(xlock) {
//access x here
}
//do something here - but don�0�7t use shared resources
synchronized(ylock) {
//access y here
}
}
public void bar() {
synchronized(this) {
//access both x and y here
}
//do something here - but don�0�7t use shared resources
}
}
若為了在方法級上同步,不能將整個方法聲明為 synchronized 關鍵字。它們使用的是成員鎖,而不是 synchronized 方法能夠獲得的對象級鎖。