• 线程通信的几种实现方式


    1. Synchronized方式

    package com.hourui.validate.Test3;
    
    public class TestSynchronizedWaitNotify {
        public static void main(String[] args) {
            final Object o = new Object();
    
            char[] a1 = "1234567".toCharArray();
            char[] ac = "ABCDEFG".toCharArray();
    
            new Thread(() -> {
                synchronized (o) {
                    for(char c : a1) {
                        System.out.print(c);
                        try {
                            o.notify();
                            o.wait(); //让出锁
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    o.notify();  //必须,否则无法停止程序
                }
            },"t1").start();
    
            new Thread(() -> {
                synchronized (o) {
                    for(char c : ac) {
                        System.out.print(c);
                        try {
                            o.notify();
                            o.wait();  //让出锁
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    o.notify(); //必须,否则无法停止程序
                }
            },"t2").start();
        }
    }

    2.Condition方式

    package com.hourui.validate.Test3;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class TestCondition {
        private static int num = 1;
    
        public static void main(String[ ]args) {
            ReentrantLock lock = new ReentrantLock();
            Condition c1 = lock.newCondition();
            Condition c2 = lock.newCondition();
    
            char[] a1 = "1234567".toCharArray();
            char[] ac = "ABCDEFG".toCharArray();
    
            new Thread(() ->{
                try {
                    lock.lock();
                    for(char c :a1) {
                        while (num != 1) {
                            try {
                                c1.await();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
    
                        System.out.print(c);
                        num = 2;
                        c2.signal();
                    }
    
                } finally {
                    lock.unlock();
                }
            },"t1").start();
    
    
            new Thread(() ->{
                try {
                    lock.lock();
                    for(char c :ac) {
                        while (num != 2) {
                            try {
                                c2.await();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
    
                        System.out.print(c);
                        num = 1;
                        c1.signal();
                    }
    
                } finally {
                    lock.unlock();
                }
            },"t2").start();
    
        }
    
    }

    3.CAS方式

    package com.hourui.validate.Test3;
    
    public class TestCAS {
        enum ReadyTORun{T1, T2}
        static volatile ReadyTORun r  = ReadyTORun.T1; //思考为什么必须是volatile
    
        public static void main(String []args) {
    
            char[] a1 ="1234567".toCharArray();
            char[] ac = "ABCDEFG".toCharArray();
    
            new Thread(() -> {
                for(char c : a1) {
                    while(r != ReadyTORun.T1) {
    
                    }
                    System.out.print(c);
                    r = ReadyTORun.T2;
    
                }
            },"t1").start();
    
            new Thread(() -> {
                for(char c : ac) {
                    while(r != ReadyTORun.T2) {
    
                    }
                    System.out.print(c);
                    r = ReadyTORun.T1;
    
                }
            },"t2").start();
        }
    }

    4.BlockingQueue方式

    package com.hourui.validate.Test3;
    
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
    
    public class TestBlockingQueue {
        static BlockingQueue<String> q1 = new ArrayBlockingQueue<String>(1);
        static BlockingQueue<String> q2 = new ArrayBlockingQueue<String>(1);
    
        public static void main(String[ ]args) {
            char[] a1 = "1234567".toCharArray();
            char[] a2 = "ABCDEFG".toCharArray();
    
            new Thread(() -> {
                for(char c : a1) {
                    System.out.print(c);
                    try {
                        q1.put("ok");
                        q2.take();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                }
            },"t1").start();
    
            new Thread(() -> {
                for(char c : a2) {
    
                    try {
                        q1.take();
                        System.out.print(c);
                        q2.put("ok");
    
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                }
            },"t2").start();
        }
    }

    5.LockSupport方式

    package com.hourui.validate.Test3;
    
    import java.util.concurrent.locks.LockSupport;
    
    public class TestLockSupport {
    
        static Thread t1 = null, t2 = null;
    
        public static void main(String[ ]args) {
            char[] a1 = "1234567".toCharArray();
            char[] ac = "ABCDEFG".toCharArray();
            t1 = new Thread(() -> {
                for(char c : a1) {
                    System.out.print(c );
                    LockSupport.unpark(t2);
                    LockSupport.park();
                }
            },"t1");
    
            t2 = new Thread(() -> {
                for(char c : ac) {
                    LockSupport.park();
                    System.out.print(c );
                    LockSupport.unpark(t1);
    
                }
            },"t1");
    
            t1.start();
            t2.start();
        }
    }
  • 相关阅读:
    jx problem
    redhat nginx 启动脚本
    nginx trouble shooting
    异常:2 字节的 UTF-8 序列的字节 2 无效 解决方法
    Springcloud-eureka异常:
    javax.servlet.ServletException: Circular view path [login]: would dispatch back to the current handler URL [/login] again. Check your ViewResolver setup!--异常
    Layui--iframe内嵌页面简单部署
    Error querying database. Cause: java.lang.UnsupportedOperationException-异常
    Error:(4, 25) java: 找不到符号符号:类 xxx位置:程序包 xxx.xxx
    win-安装数个mysql
  • 原文地址:https://www.cnblogs.com/liuyi13535496566/p/13521097.html
Copyright © 2020-2023  润新知