juc下常用的五個高併發工具

2021-09-12 07:41:47 字數 4392 閱讀 6773

1、countdownlatch:同步計數器

當countdownlatch的count計數》0時,await()會造成執行緒阻塞,當使用countdown()讓count-- == 0時,執行緒結束阻塞。 如果想讓其他執行緒執行完指定程式,其他所有程式都執行結束後再執行,這時可以用countdownlatch,但計數無法被重置,如果需要重置計數,請考慮使用 cyclicbarrier。下面demo演示了當所有執行緒執行完任務後。

public class countdownlatchdemo implements runnable 

//這裡要使用同步synchronized

synchronized public void run() catch (exception e) finally

}public static void main(string args) throws interruptedexception

//開始讓所有執行緒工作

begin.countdown();

//end.await();

system.out.println("所有執行緒完成任務,可以開始做其它想做的事 了....");

}}

2、cyclicbarrier: 執行緒屏障的功能

可以協同多個執行緒,讓多個執行緒在這個屏障前等到,直到所有執行緒都到達了這個屏障時,再一起執行後面的操作。下面demo建立11個執行緒,前面每乙個執行緒使用await()都會使當前執行緒阻塞,直到最後乙個執行緒使用await()會使11個執行緒全部退出阻塞。

public class cyclicbarrierdemo implements runnable 

public void run() catch (exception e)

}public static void main(string args) throws exception

cyclicbarrier.await();

system.out.println("全部到達屏障....");

}}

3、exchanger:用來使兩個執行緒交換資料。

當乙個執行緒執行到exchange()方法時會阻塞,另乙個執行緒執行到exchange()時,二者交換資料,然後執行後面的程式。

public class exchangerdemo implements runnable 

public void run() catch (interruptedexception e)

}public static void main(string args)

}

4、semaphore:控制訊號量的個數,構造時傳入個數。總數就是控制併發的數量。

執行緒執行前用acquire()方法獲得訊號,執行完通過release()方法歸還訊號量。如果可用訊號為0,acquire就會造成阻塞,等待release釋放訊號。作用就是只讓指定個數的執行緒(隨機選擇或先來後到)並行。

public class semaphoredemo implements runnable 

public void run() catch (interruptedexception e) finally

}public static void main(string args)

}}

5、future:介面,futuretask是它的實現類,配合執行緒池來一起工作,將任務交給執行緒池去處理。

public class futuredemo 

});new thread((runnable) task).start();

system.out.println("start.........");

timeunit.seconds.sleep(2);

system.out.println("result: " + task.get());

}}

最後貼乙個業務場景分別用cyclicbarrier和future**片段:

用cyclicbarrier實現

int size = executemethods.length;

cyclicbarrier cyclicbarrier = new cyclicbarrier(size+1);

for (int i = 0; i < size; i++)

try catch (interruptedexception e) catch (brokenbarrierexception e)

public class checkitemstask implements runnable 

public checkitemstask(integer customerid, string methodname,

cyclicbarrier cyclicbarrier, checkresultvo checkresultvo)

synchronized public void run() 的執行時間為 time={}", execute_prefix+methodname, endtime-starttime);

} finally catch (interruptedexception e) catch (brokenbarrierexception e) }}

/*** @param methodname

* @return

*/private void excutechecktask(string methodname, checkresultvo checkresultvo) else

} catch (nosuchmethodexception e) catch (illegalacces***ception e) catch (invocationtargetexception e)

}/**

* @param settlemethodname

* @param istrue

*/private void setcheckvalue(string settlemethodname, boolean istrue) catch (nosuchmethodexception e) catch (illegalacces***ception e) catch (invocationtargetexception e)

}}

用future實現

list> results = lists.newarraylist();

for (int i = 0; i < size; i++)

results.stream().foreach(r -> catch (interruptedexception e) catch (executionexception e)

});

public class checkitemstasks implements callable 

public checkitemstasks(integer customerid, string methodname, checkresultvo checkresultvo)

@override

public object call() throws exception 的執行時間為 time={}", execute_prefix+methodname, endtime-starttime);

return checkresultvo;

}/**

* @param methodname

* @return

*/private void excutechecktask(string methodname, checkresultvo checkresultvo) else

} catch (nosuchmethodexception e) catch (illegalacces***ception e) catch (invocationtargetexception e)

}/**

* @param settlemethodname

* @param istrue

*/private void setcheckvalue(string settlemethodname, boolean istrue) catch (nosuchmethodexception e) catch (illegalacces***ception e) catch (invocationtargetexception e)

}}

多執行緒 五 JUC常用工具

public class conditionwait implements runnable override public void run catch interruptedexception e finally public class conditionsignal implements r...

Random在高併發下的缺陷以及JUC對其的優化

public static void main string args public static void main string args random類除了提供無參的構造方法以外,還提供了有參的構造方法,我們可以傳入int型別的引數,這個引數就被稱為 種子 這樣 種子 就固定了,生成的隨機數也...

juc包下的關於併發四大工具類

countdownlatch 閉鎖 使用countdownlatch可以實現類似多執行緒下計數器的功能。構造器 1.引數count為計數器 2.呼叫await 方法時,執行緒被掛起,它會等待直到count值為0才繼續執行 過載 public boolean await long await time...