JUC(java.util.concurrent)是官必工具在Java 5中引入的一个并发编程的扩展库,目的类详是为了更加方便、快捷和安全地实现并发编程。细揭它提供了一系列的面试秘工具类、锁、官必工具队列以及原子类等来协调多线程之间的类详操作。
基于现代硬件不断地发展,细揭为了充分利用服务器资源,面试秘并发编程在我们的官必工具开发中已经无处不在,今天主要了解下JUC包中提供的类详几个工具类,让我们在并发编程时提供助力。
Java并发编程是一门复杂的技术,其中有一些难点需要特别注意。以下是一些Java并发编程的难点:
核心方法:
/** * 定义计数器数量,用于定义多少个执行线程 */public CountDownLatch(int count);/** * 阻塞方法,直到计数器为0时才会继续执行后续代码 */public void await();/** * 每次调用改方法,则计数器减一 */public void countDown();
核心方法:
/** * 定义计数器数量与回调函数 */public CyclicBarrier(int parties, Runnable barrierAction);/** * 阻塞方法,当有线程执行到则计数器加一,等到达到目标数后才会继续后续代码 */public int await();/** * 通过该方法可以实现计数器的重置 */public void reset();
核心方法:
/** * 定义许可数量 */public Semaphore(int permits);/** * 申请许可,改方法会阻塞程序 */public void acquire();/** * 释放许可 */public void release();
CountDownLatch的使用场景
CountDownLatch是Java并发包中的一个工具类,它可以实现线程之间的协作。具体来说,CountDownLatch可以让一个线程等待多个线程执行完毕,再继续执行。CountDownLatch常用于以下场景:
@Test public void test() throws InterruptedException { int count = 10; CountDownLatch countDownLatch = new CountDownLatch(count); IntStream.range(0,count).forEach(i->{ new Thread(()->{ System.out.println( "执行线程:"+ i ); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { throw new RuntimeException(e); } countDownLatch.countDown(); }).start(); }); countDownLatch.await(); System.out.println("线程执行完成"); }
CyclicBarrier的使用场景
它允许多个线程在某个屏障处等待,直到所有线程都到达该屏障时才会继续执行。
CyclicBarrier 适用于一组线程需要相互等待,直到所有线程都完成某个任务后才能继续执行下一步操作的场景。例如,一个大型的计算任务可以被分成多个子任务, 每个子任务由一个线程执行。当所有子任务完成后,这些线程需要等待,直到所有子任务都完成,然后再执行下一步操作。
另外,CyclicBarrier 还可以用于优化代码性能。例如,当我们需要等待多个线程都完成某项工作后,才能进行下一步操作。此时,我们可以使用 CyclicBarrier 来实现等待, 而不是使用 Thread.sleep() 方法等待一段时间。这样可以避免无谓的等待时间,提高代码效率。
@Test public void test() { int count = 10; AtomicBoolean finish = new AtomicBoolean(false); CyclicBarrier cyclicBarrier = new CyclicBarrier(count, ()->{ System.out.println("线程执行完成"); finish.set(true); }); IntStream.range(0,count).forEach(i->{ new Thread(()->{ System.out.println( "执行线程:"+ i ); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { throw new RuntimeException(e); } try { cyclicBarrier.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (BrokenBarrierException e) { throw new RuntimeException(e); } }).start(); }); while (!finish.get()){ } }
Semaphore的使用场景
它可以控制同时访问某个共享资源的线程数量。常用于限制同时访问某个资源的线程数量,例如数据库连接池、线程池等。
@Test public void test() { int count = 10; Semaphore semaphore = new Semaphore(3); IntStream.range(0,count).forEach(i->{ new Thread(()->{ try { semaphore.acquire(); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println( "执行线程:"+ i ); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { throw new RuntimeException(e); } semaphore.release(); }).start(); }); while (true){ } }
涉及到线程的开发都伴随着复杂性,不管是在代码调试上还是理解线程切换与安全性上,JUC提供的各种强大的工具类将并发编程的复杂性进行了封装,不管是在使用或是扩展上,都能通过简单的几行代码实现多线程的各种协调工作。
责任编辑:武晓燕 来源: Java技术指北 JUC工具代码(责任编辑:知识)
凯撒文化(002425.SZ)公布消息:一季度净利润预增80%
看完了这篇实时数仓建设,才发现以前的都白看了(内有美团案例)
正商实业(00185.HK)年度纯利跌32.0% 每股基本盈利为人民币7.04分
惠普上新锐Pro 14酷睿版轻薄本 搭13代P系列首发4499元起
All in BC电池,隆基要为电池技术路线之争画上“句号”