一、生产者、消费者协作机制:

  生产者线程和消费者线程通过共享队列进行协作,生产者将数据或任务放到队列上,而消费者从列队上取数据或任务,如果队列长度有限,在队列满的时候,生产者等待,而在队列为空的时候,消费者等待。

/**
 * 使用两个栈 实现队列
 *
 * 生产者,消费者协作模式:
   共享变量是一个阻塞队列,当队列满了生产者wait(),当队列为空消费者wait();
 *
 * 阻塞队列有:
 *  接口:BlockingQueue、BlockingDeque 双端队列
 *  基数数组的实现类:ArrayBlockingQueue
 *  基于链表的实现类:LinkedBlockingQueue、LinkedBlockingDeque
 *  基于堆的实现类:PriorityBlockingQueue
 *
 */
public  class QueueTest<E> {
    private ArrayDeque<E> producerStack = null;
    private ArrayDeque<E> consumerStack = null;
    private static int num = 0;

    public static void main(String[] args) throws InterruptedException {
        QueueTest<String> eQueueTest = new QueueTest<>();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    eQueueTest.producer();
                    Thread.sleep( (int)(Math.random() * 100));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        // Thread.sleep( (int)(Math.random() * 100));
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    eQueueTest.consumer();
                    Thread.sleep( (int)(Math.random() * 100));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public  QueueTest() {
        producerStack = new ArrayDeque<>(10);
        consumerStack = new ArrayDeque<>(10);
    }

    public synchronized  void producer() throws InterruptedException {
        while (true){
            while(producerStack.size() == 10){
                this.wait();
            }

            producerStack.addLast((E) String.valueOf(++num));

            System.out.println("producerStack size :" + producerStack.size() );
            for (E e : producerStack) {
                System.out.println("producerStack..." + e.toString());
            }
            this.notifyAll();
        }

    }


    public synchronized  void consumer() throws InterruptedException {
        while(true){
            while(producerStack.isEmpty()){
                this.wait();
            }

            consumerStack.addLast(producerStack.pollLast());

            System.out.println("consumerStack size :" + consumerStack.size() );
            for (E c : consumerStack) {
                System.out.println("consumerStack..." + c.toString());
            }

            System.out.println("------------------------------------------------------------");

            if(consumerStack.size() == 10){
                while(consumerStack.size() > 0){
                    System.out.println("consumerStack,pollLast :" + consumerStack.pollLast().toString());
                }
            }

            this.notifyAll();
        }
    }
}

 

二、同步协作机制:

  在一些程序,尤其是模拟仿真程序中,要求多个线程同时开始。

/**
 * 同步协作机制
 *
 */
public class SynchronizationTest {

    private volatile boolean fired = false;

    public static void main(String[] args){

        SynchronizationTest synchronizationTest = new SynchronizationTest();

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //等待住线程唤醒
                    synchronizationTest.await();

                    System.out.println("thread 1: " + Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //等待住线程唤醒
                    synchronizationTest.await();

                    System.out.println("thread 2: " + Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        // 唤醒所有线程
        synchronizationTest.fire();
    }

    public synchronized void await() throws InterruptedException {
        while (!fired){
            wait();
        }
    }

    public synchronized void fire(){
        this.fired = true;
        notifyAll();
    }

}

 

三、主从协作机制(等待结束、异步结果):

  主线程将任务分解为若干个子任务,为每个子任务创建一个线程,主线程在继续执行其他任务之前需要等待每个子任务执行完毕。 

/**
 *  等待所有子线程执行完毕,主线程再执行
 *
 *  协作对象
 *
 *  同步类:
 *      CountDownLatch
 *
 */
public class MyLatch {

    public static void main(String[] args) throws InterruptedException {

        int countNum = 10;
        CountDownLatch countDownLatch = new CountDownLatch(countNum);

        for (int j = 0; j < countNum; j++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println("countDownLatch : " + Thread.currentThread().getName());

                        Thread.sleep((int)(Math.random() * 100));

                        countDownLatch.countDown();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }, "thread" + j).start();
        }
        countDownLatch.await();
        System.out.println("collect worker result");

    }

}
/**
 *  主从模式,一种常见的模式是异步调用,异步调用返回一个Future对象,通过它获得最终的结果;
 *
 *  1.表示异步结果的接口 Future、FutureTask
 *
 *  2.用于执行异步任务的接口Executor,以及子接口ExecutorService
 *
 *  3.用于创建Executor和ExecutorService的工厂方法类Executors
 *
 *  4.Callable 创建子任务的接口
 *
 */
public class AsynchronizationTest {


    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executor = Executors.newCachedThreadPool();

        List<MyFuture> myFutureList = new ArrayList<>();
        for (int i = 1; i <= 10 ; i++) {
            myFutureList.add(new MyFuture("callable " + i));
        }

        // 实现 callable 的子类实例
        List<Future<String>> futures = executor.invokeAll(myFutureList);
        System.out.println("futures size : " + futures.size());

        futures.forEach(p -> {
            try {
                if(!p.isDone()){
                    System.out.println("future is not done ");
                }
                System.out.println("futures" + p.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        });
        executor.shutdown();
    }

    /**
     *  实现 Callable 接口
     */
    static class MyFuture implements Callable<String> {
        private String name;
public MyFuture(String name){
             = name;
        }

        @Override
        public String call() throws Exception {
            return "callable " + name;
        }
    }
}

 

四、集合点协作机制:

  给所有线程到指定一个集合点,当都到达时才继续执行下面的程序。

/**
 *  多线程集合点协调模式
 */
public class CyclicBarrierTest {

    public static void main(String[] args){
        int num = 10;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(num, new Runnable() {
            @Override
            public void run() {
                System.out.println("所有子线程已集合,继续执行任务..."); //所有线程集合后执行
            }
        });


        for (int i = 1; i <= num; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep((int)(Math.random() * 100));

                        System.out.println(Thread.currentThread().getName() + " 等待集合...");

                        cyclicBarrier.await();

                        System.out.println(Thread.currentThread().getName() + " 已集合,继续执行...");

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            }, "cyclicBarrier " + i).start();
        }
    }
}