zoukankan      html  css  js  c++  java
  • 线程通讯三种方式

    关于线程的通讯:有三种方式

    1#synchronized实现1a2b3c交替执行

    public class Test {
        static Thread t1=null,t2=null;
        public static void main(String[] args) {
            //1a2b3c4d交替执行
            final Object o = new Object();
            char[] c1="1234".toCharArray();
            char[] c2="abcd".toCharArray();
            //线程t1
            t1=new Thread(()->{
                synchronized (o){
                    for (char c:c1){
                        System.out.println(c);
                        try {
                            o.notify();
                            Thread.sleep(1000);//休眠1s
                            o.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    o.notify();
                }
            },"t1");
            //线程t2
            t2=new Thread(()->{
                synchronized (o){
                    for (char c:c2){
                        System.out.println(c);
                        try {
                            o.notify();
                            Thread.sleep(1000);
                            o.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    o.notify();
                }
            },"t2");
            t1.start();
            t2.start();
        }
    }

    2#使用volatile关键字实现通信

    public class Test2 {
        //定义一个共享变量实现通信
        static volatile boolean notice=false;
        static Thread t1=null,t2=null;
        public static void main(String[] args) {
            char[] c1="1234".toCharArray();
            char[] c2="abcd".toCharArray();
            t1=new Thread(()->{
                System.out.println("线程t1开始执行");
                for (char c:c1){
                    System.out.println(c);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    while (c=='4'){
                        notice=true;
                        break;
                    }
                }
            });
            t2=new Thread(()->{
                while (true){
                    if (notice){
                        System.out.println("线程t2收到通知,开始执行");
                        for (char c:c2){
                            System.out.println(c);
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        break;
                    }
                }
            });
            t2.start();
            t1.start();
        }
    }

    3#使用Condition控制线程通信

    public class Test3 {
        static Thread t1=null,t2=null;
        public static void main(String[] args) {
            //1a2b3c4d交替执行
            char[] c1="1234".toCharArray();
            char[] c2="abcd".toCharArray();
            ReentrantLock lock = new ReentrantLock();
            Condition condition = lock.newCondition();
            //线程t1
            t1=new Thread(()->{
                lock.lock();
                    for (char c:c1){
                        System.out.println(c);
                        try {
                            condition.signal();
                            Thread.sleep(1000);//休眠1s
                            condition.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    lock.unlock();
            });
            //线程t2
            t2=new Thread(()->{
                lock.lock();
                    for (char c:c2){
                        System.out.println(c);
                        try {
                            condition.signal();
                            Thread.sleep(1000);
                            condition.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    lock.unlock();
            });
            t1.start();
            t2.start();
        }
    }
  • 相关阅读:
    java 基础学习 关键字、标识符、常量、进制、有符号表示法、变量、数据类型小节
    java 基础学习 异常的处理和自定义 学习总结
    正则表达式应用--实例应用
    ArrayList:去除集合中字符串的重复值 LinkedList:去除集合中自定义对象的重复值
    java IO流中文件,图像,视频,拷贝总结
    递归算法学习心得与体会
    如何打印身份证的正反面
    添加div间距
    Junit:NoSuchMethodError runLeaf runChild
    Ajax:async
  • 原文地址:https://www.cnblogs.com/afeiiii/p/13774095.html
Copyright © 2011-2022 走看看