项目需求需要多线程执行计算任务,主线程要等所有线程执行完毕,记录执行结果。另外要控制并行线程数量,防止用光内存。实现测试代码如下。
测试代码如下:
public class ThreadsTest {public static ExecutorService exec;public static void main(String[] args) throws WriteException, IOException {// 线程池exec = Executors.newCachedThreadPool();// 只能2个线程同时访问final Semaphore semp = new Semaphore(2);// 模拟10个客户端访问for (int i=0;i<10;i++) {Runnable run = new Runnable() {@Overridepublic void run() {try {// 获取许可semp.acquire();for(int j=0; j<6;j++){Thread.sleep(100);System.out.println("--------j----threadName-----" + j + "====" + Thread.currentThread().getName());}// 访问完后,释放semp.release();//availablePermits()指的是当前信号灯库中有多少个可以被使用System.out.println("-----------------" + semp.availablePermits());} catch (InterruptedException e) {e.printStackTrace();}}};exec.execute(run);}exec.shutdown();System.out.println("------------都结束了?????????------------");while(true){try{Thread.sleep(100);if(exec.isTerminated()){System.out.println("都结束了!");break;}}catch(Exception e){e.printStackTrace();}}}}
实际输出如下;
------------都结束了?????????------------
--------j----threadName-----0====pool-1-thread-1
--------j----threadName-----0====pool-1-thread-2
--------j----threadName-----1====pool-1-thread-1
--------j----threadName-----1====pool-1-thread-2
--------j----threadName-----2====pool-1-thread-1
--------j----threadName-----2====pool-1-thread-2
--------j----threadName-----3====pool-1-thread-1
--------j----threadName-----3====pool-1-thread-2
--------j----threadName-----4====pool-1-thread-2
--------j----threadName-----4====pool-1-thread-1
--------j----threadName-----5====pool-1-thread-1
--------j----threadName-----5====pool-1-thread-2
-----------------2
-----------------2
--------j----threadName-----0====pool-1-thread-5
--------j----threadName-----0====pool-1-thread-3
--------j----threadName-----1====pool-1-thread-5
--------j----threadName-----1====pool-1-thread-3
--------j----threadName-----2====pool-1-thread-5
--------j----threadName-----2====pool-1-thread-3
--------j----threadName-----3====pool-1-thread-3
--------j----threadName-----3====pool-1-thread-5
--------j----threadName-----4====pool-1-thread-3
--------j----threadName-----4====pool-1-thread-5
--------j----threadName-----5====pool-1-thread-5
--------j----threadName-----5====pool-1-thread-3
-----------------1
-----------------1
--------j----threadName-----0====pool-1-thread-4
--------j----threadName-----0====pool-1-thread-6
--------j----threadName-----1====pool-1-thread-4
--------j----threadName-----1====pool-1-thread-6
--------j----threadName-----2====pool-1-thread-4
--------j----threadName-----2====pool-1-thread-6
--------j----threadName-----3====pool-1-thread-6
--------j----threadName-----3====pool-1-thread-4
--------j----threadName-----4====pool-1-thread-4
--------j----threadName-----4====pool-1-thread-6
--------j----threadName-----5====pool-1-thread-6
-----------------1
--------j----threadName-----5====pool-1-thread-4
-----------------1
--------j----threadName-----0====pool-1-thread-7
--------j----threadName-----0====pool-1-thread-8
--------j----threadName-----1====pool-1-thread-7
--------j----threadName-----1====pool-1-thread-8
--------j----threadName-----2====pool-1-thread-7
--------j----threadName-----2====pool-1-thread-8
--------j----threadName-----3====pool-1-thread-8
--------j----threadName-----3====pool-1-thread-7
--------j----threadName-----4====pool-1-thread-8
--------j----threadName-----4====pool-1-thread-7
--------j----threadName-----5====pool-1-thread-8
--------j----threadName-----5====pool-1-thread-7
-----------------1
-----------------1
--------j----threadName-----0====pool-1-thread-10
--------j----threadName-----0====pool-1-thread-9
--------j----threadName-----1====pool-1-thread-9
--------j----threadName-----1====pool-1-thread-10
--------j----threadName-----2====pool-1-thread-10
--------j----threadName-----2====pool-1-thread-9
--------j----threadName-----3====pool-1-thread-9
--------j----threadName-----3====pool-1-thread-10
--------j----threadName-----4====pool-1-thread-9
--------j----threadName-----4====pool-1-thread-10
--------j----threadName-----5====pool-1-thread-9
-----------------1
--------j----threadName-----5====pool-1-thread-10
-----------------2
都结束了!