實現方式多種多樣,下面列兩種供參考:
importjava.util.ArrayList;
importjava.util.List;
importjava.util.concurrent.*;
publicclassMain{
publicstaticvoidmain(String[]args)throwsInterruptedException,ExecutionException{
System.out.println("方式1");
System.out.println("================================================");
//方式1
//創建一個線程池,並創建10個線程放入線程池執行
ExecutorServicepool=Executors.newCachedThreadPool();
for(inti=0;i<10;i++){
pool.execute(newMyThread("線程"+i));
}
//線程池不再接收新任務
pool.shutdown();
//線程池中的所有線程都執行完pool.isTerminated()才返回true
while(!pool.isTerminated()){
Thread.sleep(100);
}
System.out.println("所有線程執行完成");
System.out.println(" 方式2");
System.out.println("================================================");
//方式2
ExecutorServicepool2=Executors.newCachedThreadPool();
List<Future>futures=newArrayList<>();
for(inti=0;i<10;i++){
//使用實現Callable介面的方式創建線程,通過Future可以獲取線程中返回的結果
Futurefuture=pool2.submit(newMyThread2("線程"+i));
futures.add(future);
}
for(Futurefuture:futures){
//該方法會阻塞主線程,直到線程執行完成
future.get();
}
System.out.println("所有線程執行完成");
}
}
classMyThreadextendsThread{
privateStringname;
publicMyThread(Stringname){
this.name=name;
}
@Override
publicvoidrun(){
try{
Thread.sleep(3000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println(name+"執行完成");
}
}
{
privateStringname;
publicMyThread2(Stringname){
this.name=name;
}
@Override
publicObjectcall()throwsException{
try{
Thread.sleep(3000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println(name+"執行完成");
returnnull;
}
}
2. 《Java並發編程實戰》pdf下載在線閱讀,求百度網盤雲資源
《Java並發編程實戰》(Brian Goetz)電子書網盤下載免費在線閱讀
鏈接:https://pan..com/s/1LkHQ1LOcgxHjCxplxfhmSg提取碼:1234
書名:Java並發編程實戰
作者:Brian Goetz
譯者:童雲蘭
豆瓣評分:9.0
出版社:機械工業出版社華章公司
出版年份:2012-2
頁數:293
內容簡介:
本書深入淺出地介紹了Java線程和並發,是一本完美的Java並發參考手冊。書中從並發性和線程安全性的基本概念出發,介紹了如何使用類庫提供的基本並發構建塊,用於避免並發危險、構造線程安全的類及驗證線程安全的規則,如何將小的線程安全類組合成更大的線程安全類,如何利用線程來提高並發應用程序的吞吐量,如何識別可並行執行的任務,如何提高單線程子系統的響應性,如何確保並發程序執行預期任務,如何提高並發代碼的性能和可伸縮性等內容,最後介紹了一些高級主題,如顯式鎖、原子變數、非阻塞演算法以及如何開發自定義的同步工具類。
本書適合Java程序開發人員閱讀。
作者簡介:
本書作者都是Java Community Process JSR 166專家組(並發工具)的主要成員,並在其他很多JCP專家組里任職。Brian Goetz有20多年的軟體咨詢行業經驗,並著有至少75篇關於Java開發的文章。Tim Peierls是「現代多處理器」的典範,他在BoxPop.biz、唱片藝術和戲劇表演方面也頗有研究。Joseph Bowbeer是一個Java ME專家,他對並發編程的興趣始於Apollo計算機時代。David Holmes是《The Java Programming Language》一書的合著者,任職於Sun公司。Joshua Bloch是Google公司的首席Java架構師,《Effective Java》一書的作者,並參與著作了《Java Puzzlers》。Doug Lea是《Concurrent Programming》一書的作者,紐約州立大學 Oswego分校的計算機科學教授。
3. JAVA並發編程實踐的內容簡介
《JAVA並發編程實踐》隨著多核處理器的普及,使用並發成為構建高性能應用程序的關鍵。Java 5以及6在開發並發程序中取得了顯著的進步,提高了Java虛擬機的性能以及並發類的可伸縮性,並加入了豐富的新並發構建塊。在《JAVA並發編程實踐》中,這些便利工具的創造者不僅解釋了它們究竟如何工作、如何使用,還闡釋了創造它們的原因,及其背後的設計模式。
4. java並發編程問題
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class CachedFactorizer implements Servlet { //java 網路訪問中的緩存編程
// @GuardedBy is an annotation introced by Brian Goetz in his excellent
// book on concurrency : Java Concurrency In Practice. The idea is that
// you indicate the lock that you need to hold before you access a particular
// member variable.
@GuardedBy("this") private BigInteger lastNumber;
//means you should synchronize on "this" before accessing lastNumber.
@GuardedBy("this") private BigInteger[] lastFactors;
//means you should synchronize on "this" before accessing lastFactors.
@GuardedBy("this") private long hits;
//means you should synchronize on "this" before accessing hits.
@GuardedBy("this") private long cacheHits;
//means you should synchronize on "this" before accessing cacheHits.
public synchronized long getHits() {
return hits;
}
public synchronized double getCacheHitRatio() {
return (double) cacheHits / (double) hits;
}
public void service(ServletRequest req, ServletResponse resp) {
BigInteger i = extractFromRequest(req);
BigInteger[] factors = null;
//訪問前面提到的那些敏感數據之前,先call synchronized(this) 同步
synchronized(this) {
++hits; //hit 自動加1
if(i.equals(lastNumber)) { //如果i和lastNumber是相等的話
++cacheHits; //cacheHits 自動加1
factors = lastFactors.clone(); //factors更新數據用lastFactors
}
}
if(factors == null) { //如果factors是空的話。
factors = factor(i); //更新factors的數據
synchronized(this) { //訪問前面提到的那些敏感數據之前,先call synchronized(this) 同步
lastNumber = i; //更新lastNumber
lastFactors = factors.clone(); //lastFactors 用factors來更新
}
}
encodeIntoResponse(resp, factors); //取得resp然後返回對應數據
}
}
5. java並發編程主要用來解決什麼問題,應用場景是什麼
解決性能問題.多個線程一起跑.可以使用多個cpu.
另外有時外部系統會成為瓶頸,多個並發,可以避免對於外部系統的等待.
所以基本上網路編程都是並發的. 大量數據需要處理的代碼也往往會用並發來提速.
6. java並發編程中,有哪些同步和互斥機制
多線程共享資源,比如一個對象的內存,怎樣保證多個線程不會同時訪問(讀取或寫入)這個對象,這就是並發最大的難題,因此產生了 互斥機制(鎖)。
using the same monitor lock.
獲取鎖後,該線程本地存儲失效,臨界區(就是獲得鎖後釋放鎖之前 的代碼區)從主存獲取數據,並在釋放鎖後刷入主存。
互斥:
保證臨界區代碼線程間互斥。
synchronized實現同步的基礎:
java中每個對象都可以作為鎖
一個任務可以多次獲得鎖,比如在一個線程中調用一個對象的 synchronized標記的方法,在這個方法中調用第二個synchronized標記的方法,然後在第二個synchronized方法中調用第三個synchronized方法。一個線程每次進入一個synchronized方法中JVM都會跟蹤加鎖的次數,每次+1,當該這個方法執行完畢,JVM計數-1;當JVM計數為0時,鎖完全被釋放,其他線程可以訪問該變數。
在使用並發時將對象的field設為private 很重要!尤其是使用static變數(evil static variable) 使用 Lock lock =new ReentrantLock()的問題是代碼不夠優雅,增加代碼量;我們一般都是使用synchronized實現互斥機制。但是1.當代碼中拋出異常時,顯示鎖的finally里可以進行資源清理工作。2.ReentrantLock還給我們更細粒度的控制力
7. 什麼是java並發性 深度剖析Java的並發性
做並發編程之前,必須首先理解什麼是並發,什麼是並行。
並發(concurrency)和並行(parallellism)關系:
解釋一:並行是指兩個或者多個事件在同一時刻發生;而並發是指兩個或多個事件在同一時間間隔發生。
解釋二:並行是在不同實體上的多個事件,並發是在同一實體上的多個事件。
解釋三:在一台處理器上「同時」處理多個任務,在多台處理器上同時處理多個任務。如hadoop分布式集群
所以並發編程的目標是充分的利用處理器的每一個核,以達到最高的處理性能。
8. Java並發編程(二)為什麼需要多線程
*使用線程可以把占據時間長的程序中的任務放到後台去處理
*程序的運行速度可能加快
*在一些等待的任務實現上如用戶輸入、文件讀寫和網路收發數據等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內存佔用等等。
*多線程技術在IOS軟體開發中也有舉足輕重的位置。
9. Java並發編程番外篇(一)如何結束一個線程
線程有四種狀態,任何一個線程肯定處於這四種狀態中的一種:1) 產生(New):線程對象已經產生,但尚未被啟動,所以無法執行。如通過new產生了一個線程對象後沒對它調用start()函數之前。 2) 可執行(Runnable):每個支持多線程的系統都有一個排程器,排程器會從線程池中選擇一個線程並啟動它。當一個線程處於可執行狀態時,表示它可能正處於線程池中等待排排程器啟動它;也可能它已正在執行。如執行了一個線程對象的start()方法後,線程就處於可執行狀態,但顯而易見的是此時線程不一定正在執行中。 3) 死亡(Dead):當一個線程正常結束,它便處於死亡狀態。如一個線程的run()函數執行完畢後線程就進入死亡狀態。 4) 停滯(Blocked):當一個線程處於停滯狀態時,系統排程器就會忽略它,不對它進行排程。當處於停滯狀態的線程重新回到可執行狀態時,它有可能重新執行。如通過對一個線程調用wait()函數後,線程就進入停滯狀態,只有當兩次對該線程調用notify或notifyAll後它才能兩次回到可執行狀態。