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...