CountDowmLacth使用:
他经常用于监听某些初始化的操作,等待初始化完毕后,通知主线程继续工作.(属于一个线程等待,等其它n线程发出通知)
CyclicBarrier的使用:
使用场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待.(几个线程都是参与阻塞的,每个线程都准备好了,就会移除障碍,接着执行).
Callable和Future使用:
future模式非常适合在处理很耗时很长的业务逻辑时进行使用,可以有效的减少系统的响应时间,提高系统的吞吐量.
public class UserFuture implements Callable<String> { private String para; public UserFuture(String para){ this.para = para; } /** * 这里是真实的业务逻辑,处理起来可能会比较慢 */ public String call() throws Exception { //模拟耗时 Thread.sleep(5000); String result = this.para + "处理完成"; return result; } //主控函数 public static void main(String[] args) throws InterruptedException, ExecutionException { String queryStr = "query"; //构造futureTask 并且传入需要真正进行业务逻辑处理的类,该类一定是实现callable接口的类 FutureTask<String> future1= new FutureTask<>(new UserFuture(queryStr)); FutureTask<String> future2= new FutureTask<>(new UserFuture(queryStr)); //创建一个固定线程的线程池且线程数为2 ExecutorService threadPool = Executors.newFixedThreadPool(2); //这里提交任务future,则开启线程执行RealData的call方法的执行 //submit 和 execute的区别 : 第一点是submit可以传入实现callable,runable接口的实例对象 第二点,submit方法有返回值 Future submit1 = threadPool.submit(future1); //单独启动一个线程去执行任务 Future submit2 = threadPool.submit(future2); //单独启动一个线程去执行任务 System.out.println("请求完毕"); //这里的submit1 submit2 可以判断这个单独的线程是否已经执行完成 /*while(true){ if(submit1.get() == null){ System.out.println("异步的任务已经执行完成"); break; } }*/ try { //这里可以做额外的数据操作,也就是主程序执行其它的业务逻辑 System.out.println("处理其它的业务逻辑...."); Thread.sleep(1000); } catch (Exception e) { // TODO: handle exception } //调用获取数据的方法,如果call()方法没有执行完成呢,则会进行等待. System.out.println("数据:" + future1.get()); System.out.println("数据:" + future2.get()); threadPool.shutdown(); } }
                    
                
                
            
        
浙公网安备 33010602011771号