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();
        }
    }
  • 相关阅读:
    事务与数据库连接池DBCP和C3P0与工具类DBUtils
    JavaWeb基础JSP页面EL 和JSTL表达式
    Cookie和Session
    HttpServletRequest 和HttpServletResponse
    Http协议和Servlet
    Xml 和Tomcat
    Struts2第二天:Struts2的数据的封装、结果页面配置
    BootStrap基础知识总结
    Linux和Windows下Mysql数据库安装详解
    CSS 边框
  • 原文地址:https://www.cnblogs.com/afeiiii/p/13774095.html
Copyright © 2011-2022 走看看