本文共 8202 字,大约阅读时间需要 27 分钟。
public class Demo1 { public static void main(String[] args) throws InterruptedException { //参数4表示必须受到4次通知才可以 CountDownLatch countDownLatch = new CountDownLatch(4); MyRunnable myRunnableA = new MyRunnable(1, 4, countDownLatch); MyRunnable myRunnableB = new MyRunnable(5, 10, countDownLatch); //创建线程去执行任务 Thread a = new Thread(myRunnableA, "A"); a.start(); Thread b = new Thread(myRunnableB, "B"); b.start(); //在这里进行等待, 直到受到4次通知才不等待 countDownLatch.await(); int result = myRunnableA.getResult() + myRunnableB.getResult(); System.out.println("1~10的和为: " + result); }}class MyRunnable implements Runnable { private int start; private int end; private int result; private CountDownLatch countDownLatch; public MyRunnable(int start, int end, CountDownLatch countDownLatch) { this.start = start; this.end = end; this.countDownLatch = countDownLatch; } @Override public void run() { //执行一段计算任务 for (int i = start; i <= end; i++) { result += i; } //通知一次 countDownLatch.countDown(); //一个线程可以通知任意次 countDownLatch.countDown(); } public int getResult() { return result; }}
public class Demo2 { public static void main(String[] args) { //三表示他这一组有三个线程需要等待, 只有三个线程都在执行了await, 他们才会继续执行 CyclicBarrier cyclicBarrier = new CyclicBarrier(3); RunnableDemo runnableDemo = new RunnableDemo(cyclicBarrier); //创建三个线程 Thread a = new Thread(runnableDemo, "A"); Thread b = new Thread(runnableDemo, "B"); Thread c = new Thread(runnableDemo, "C"); a.start(); b.start(); c.start(); }}class RunnableDemo implements Runnable { private CyclicBarrier cyclicBarrier; public RunnableDemo(CyclicBarrier cyclicBarrier) { this.cyclicBarrier = cyclicBarrier; } @Override public void run() { System.out.println(Thread.currentThread().getName() + " 进入run方法"); try { cyclicBarrier.await(); System.out.println(Thread.currentThread().getName() + " 离开run方法"); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } }}
public static void main(String[] args) { //三表示他这一组有三个线程需要等待, 只有三个线程都在执行了await, 他们才会继续执行 CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new Runnable() { @Override public void run() { System.out.println("AAA"); } }); RunnableDemo runnableDemo = new RunnableDemo(cyclicBarrier); //创建三个线程 Thread a = new Thread(runnableDemo, "A"); Thread b = new Thread(runnableDemo, "B"); Thread c = new Thread(runnableDemo, "C"); a.start(); b.start(); c.start(); }
public class Demo3 { public static void main(String[] args) throws InterruptedException { //初始化semaphore Service service = new Service(10); //创建线程池让线程池去消耗semaphore资源 ExecutorService pool = Executors.newFixedThreadPool(Service.MAx_THREAD); for (int i = 0; i < Service.MAx_THREAD; i++) { pool.execute(new Runnable() { @Override public void run() { try { service.getSemaphore().acquire(); System.out.println("use data"); System.out.println(new Date().toString()); Thread.sleep(5000); service.getSemaphore().release(); } catch (InterruptedException e) { e.printStackTrace(); } } }); } Thread.sleep(1000); pool.shutdown(); }}class Service { public static final int MAx_THREAD = 30; private Semaphore semaphore; public Service(int num) { this.semaphore = new Semaphore(num); } public Semaphore getSemaphore() { return semaphore; }}
public class Demo4 { public static void main(String[] args) { Exchangerexchanger = new Exchanger<>(); ThreadA threadA = new ThreadA(exchanger); ThreadB threadB = new ThreadB(exchanger); threadA.start(); threadB.start(); }}class ThreadA extends Thread { private Exchanger exchanger; public ThreadA(Exchanger exchanger) { this.setName("A"); this.exchanger = exchanger; } @Override public void run() { String a = "我是Java代码"; try { String b = exchanger.exchange(a); if (a.equals(b)) { System.out.println(Thread.currentThread().getName() + "相同"); } else { System.out.println(Thread.currentThread().getName() + "不相同"); } } catch (InterruptedException e) { e.printStackTrace(); } }}class ThreadB extends Thread { private Exchanger exchanger; public ThreadB(Exchanger exchanger) { this.setName("B"); this.exchanger = exchanger; } @Override public void run() { String b = "我是Java代码"; try { String a = exchanger.exchange(b); if (b.equals(a)) { System.out.println(Thread.currentThread().getName() + "相同"); } else { System.out.println(Thread.currentThread().getName() + "不相同"); } } catch (InterruptedException e) { e.printStackTrace(); } }}
转载地址:http://tjsci.baihongyu.com/