java并发编程--线程之间的通信

使用死循环+volatile关键字  方法实现线程间的通信.
package cn.bufanli.test;

import java.util.ArrayList;
import java.util.List;

/**
 * 多线程之间的通信
 *      线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体,
 *      线程之间的通信就成为整体的必用方式之一,当线程存在通信指挥,系统之间的交互性
 *      更强,在提高cup利用率的同时还会使开发人员对线程任务在处理的过程中进行有效的
 *      监控和监督;
 * 使用wait/notify 方法实现线程间的通信.(这两个方法都是Object类的方法,
 *      换句话说就是java对所有对象都提供了这两个方法)
 *      1.wait和notify 必须配合synchronized关键字使用
 *      2.wait方法释放锁,notify方法不释放锁
 * @author BSL
 */
public class ListAdd01 {
    /**
     * volatile 共享对象,是对象在多个线程中可见
     */
    public volatile static List list = new ArrayList();
    public void add(){
        list.add("bsl");
    }
    public  int size(){
        return  list.size();
    }

    public static void main(String[] args) {
        final  ListAdd01 list1 = new ListAdd01();
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                list1.add();
                System.out.println("当前线程: " + Thread.currentThread().getName() + " 添加了一个元素");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"t1");

        Thread t2 = new Thread(() -> {
            //使用死循环+volatile关键字去监听对象的变化
            while (true){
                if(list.size()==5){
                    System.out.println("当前线程收到通知:" + Thread.currentThread().getName() + "list size =5 线程停止..");
                    throw new RuntimeException();
                }
            }

        }, "t2");
        t1.start();
        t2.start();
    }
}
使用wait/notify 方法实现线程间的通信.
package cn.bufanli.test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
 * 使用wait/notify 方法实现线程间的通信.(这两个方法都是Object类的方法,
 *      换句话说就是java对所有对象都提供了这两个方法)
 *      1.wait和notify 必须配合synchronized关键字使用
 *      2.wait方法释放锁,notify方法不释放锁
 * @author BSL
 */
public class ListAdd02 {
    /**
     * volatile 共享对象,是对象在多个线程中可见
     */
    public volatile static List list = new ArrayList();
    public void add(){
        list.add("bsl");
    }
    public  int size(){
        return  list.size();
    }

    public static void main(String[] args) {
        final ListAdd02 list1 = new ListAdd02();
        /**
         * 实例化一个lock
         *      当wait 和 notify 的时候,一定要配合着synchronized关键字去使用
         *      final Object lock = new Object();
         */
        //final Object lock = new Object();
        final CountDownLatch countDownLatch = new CountDownLatch(1);
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                   // synchronized (lock){
                        list1.add();
                        System.out.println("当前线程: " + Thread.currentThread().getName() + " 添加了一个元素");

                        Thread.sleep(500);

                        if(list1.size() ==5){
                            System.out.println("发出同知");
                           // lock.wait();
                            countDownLatch.countDown();
                        }
                   // }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"t1");

        Thread t2 = new Thread(() -> {

           // synchronized (lock){
                if(list.size()!=5){
                    try {
                        System.out.println("t2进入");
                        Thread.sleep(100);
                        //lock.wait();
                        countDownLatch.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                    System.out.println("当前线程收到通知:" + Thread.currentThread().getName() + "list size =5 线程停止..");
                    throw new RuntimeException();
           // }

        }, "t2");
        t1.start();
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2.start();
    }
}

猜你喜欢

转载自blog.csdn.net/adminBfl/article/details/102943680