面试必问! JUC 常用 4 大并发工具类是哪几个?( 三 )

<>();private static CyclicBarrier cyclicBarrier = new CyclicBarrier(5,new CollectThread());/*** 结果打印线程* 用来演示CyclicBarrier的第二个参数,barrierAction*/private static class CollectThread implements Runnable {@Overridepublic void run() {StringBuffer result = new StringBuffer();for (Map.Entry workResult : resultMap.entrySet()) {result.append("[" + workResult.getValue() + "]");}System.out.println("the result = " + result);System.out.println("do other business.....");}}/*** 工作子线程* 用于CyclicBarrier的一组线程*/private static class SubThread implements Runnable {@Overridepublic void run() {// 获取当前线程的IDlong id = Thread.currentThread().getId();// 放入统计容器中resultMap.put(String.valueOf(id), id);Random random = new Random();try {if (random.nextBoolean()) {Thread.sleep(1000 + id);System.out.println("Thread_"+id+"..... do something");}System.out.println(id+" is await");cyclicBarrier.await();Thread.sleep(1000+id);System.out.println("Thread_"+id+".....do its business");} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}}public static void main(String[] args) {for (int i = 0; i <= 4; i++) {Thread thread = new Thread(new SubThread());thread.start();}}}
返回结果:
11 is await14 is await15 is awaitThread_12..... do something12 is awaitThread_13..... do something13 is awaitthe result = [11][12][13][14][15]do other business.....Thread_11.....do its businessThread_12.....do its businessThread_13.....do its businessThread_14.....do its businessThread_15.....do its business
通过返回结果可以看出前面的 11 14 15 三个线程没有进入 if 语句块,在执行到 await 的时候进入了等待,而另外 12 13 两个线程进入到了 if 语句块当中,多休眠了 1 秒多,然后当 5 个线程同时到达 await 的时候,屏障开放,执行了线程,然后线程组继续执行 。
解释一下和的区别吧!
首先就是的构造参数传入的数量一般都是大于等于线程,数量的,因为他是有第三方控制的,可以扣减多次,然后就是的构造参数第一个参数传入的数量一定是等于线程的个数的,因为他是由一组线程自身控制的 。
和的区别
「:」
,俗称信号量,作用于控制同时访问某个特定资源的线程数量,用在流量控制
一说特定资源控制,那么第一时间就想到了数据库连接..
之前用等待超时模式写了一个数据库连接池,打算用这个也写一个
/*** Creates a {@code Semaphore} with the given number of* permits and nonfair fairness setting.** @param permits the initial number of permits available.*This value may be negative, in which case releases*must occur before any acquires will be granted.*/public Semaphore(int permits) {sync = new NonfairSync(permits);}
在源码中可以看到在构建信号量的时候,需要传入许可证的数量,这个数量就是资源的最大允许的访问的线程数 。
接下里用信号量实现一个数据库连接池 。
连接对象 。
package org.dance.day2.util.pool;import org.dance.tools.SleepTools;import java.sql.*;import java.util.Map;import java.util.Properties;import java.util.concurrent.Executor;/*** 数据库连接* @author ZYGisComputer*/public class SqlConnection implements Connection {/*** 获取数据库连接* @return*/public static final Connection fetchConnection(){return new SqlConnection();}@Overridepublic void commit() throws SQLException {SleepTools.ms(70);}@Overridepublic Statement createStatement() throws SQLException {SleepTools.ms(1);return null;}@Overridepublic PreparedStatement prepareStatement(String sql) throws SQLException {return null;}@Overridepublic CallableStatement prepareCall(String sql) throws SQLException {return null;}@Overridepublic String nativeSQL(String sql) throws SQLException {return null;}@Overridepublic void setAutoCommit(boolean autoCommit) throws SQLException {}@Overridepublic boolean getAutoCommit() throws SQLException {return false;}@Overridepublic void rollback() throws SQLException {}@Overridepublic void close() throws SQLException {}@Overridepublic boolean isClosed() throws SQLException {return false;}@Overridepublic DatabaseMetaData getMetaData() throws SQLException {return null;}@Overridepublic void setReadOnly(boolean readOnly) throws SQLException {}@Overridepublic boolean isReadOnly() throws SQLException {return false;}@Overridepublic void setCatalog(String catalog) throws SQLException {}@Overridepublic String getCatalog() throws SQLException {return null;}@Overridepublic void setTransactionIsolation(int level) throws SQLException {}@Overridepublic int getTransactionIsolation() throws SQLException {return 0;}@Overridepublic SQLWarning getWarnings() throws SQLException {return null;}@Overridepublic void clearWarnings() throws SQLException {}@Overridepublic Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {return null;}@Overridepublic CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {return null;}@Overridepublic Map> getTypeMap() throws SQLException {return null;}@Overridepublic void setTypeMap(Map> map) throws SQLException {}@Overridepublic void setHoldability(int holdability) throws SQLException {}@Overridepublic int getHoldability() throws SQLException {return 0;}@Overridepublic Savepoint setSavepoint() throws SQLException {return null;}@Overridepublic Savepoint setSavepoint(String name) throws SQLException {return null;}@Overridepublic void rollback(Savepoint savepoint) throws SQLException {}@Overridepublic void releaseSavepoint(Savepoint savepoint) throws SQLException {}@Overridepublic Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {return null;}@Overridepublic CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {return null;}@Overridepublic PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {return null;}@Overridepublic Clob createClob() throws SQLException {return null;}@Overridepublic Blob createBlob() throws SQLException {return null;}@Overridepublic NClob createNClob() throws SQLException {return null;}@Overridepublic SQLXML createSQLXML() throws SQLException {return null;}@Overridepublic boolean isValid(int timeout) throws SQLException {return false;}@Overridepublic void setClientInfo(String name, String value) throws SQLClientInfoException {}@Overridepublic void setClientInfo(Properties properties) throws SQLClientInfoException {}@Overridepublic String getClientInfo(String name) throws SQLException {return null;}@Overridepublic Properties getClientInfo() throws SQLException {return null;}@Overridepublic Array createArrayOf(String typeName, Object[] elements) throws SQLException {return null;}@Overridepublic Struct createStruct(String typeName, Object[] attributes) throws SQLException {return null;}@Overridepublic void setSchema(String schema) throws SQLException {}@Overridepublic String getSchema() throws SQLException {return null;}@Overridepublic void abort(Executor executor) throws SQLException {}@Overridepublic void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException {}@Overridepublic int getNetworkTimeout() throws SQLException {return 0;}@Overridepublic T unwrap(Class iface) throws SQLException {return null;}@Overridepublic boolean isWrapperFor(Class