试题一

试题一

题目:
  • /**
     * Created by fan on 2019/11/4.
     * <p>
     * 三个线程A,B,C
     * A打印AA  5次
     * B打印BB 10 次
     * C打印CC 15 次
     * <p>
     * A->B->C依次打印
     * 轮询 10 次
     */
    
实现
  • public class LockChangeSynchonized {
        public static void main(String[] args) throws Exception {
            Resource resource = new Resource();
            Lock lock = new ReentrantLock();
    
            Condition conditionA = lock.newCondition();
            Condition conditionB = lock.newCondition();
            Condition conditionC = lock.newCondition();
    
            new Thread(() -> {
                lock.lock();
                try {
                    for (int i = 0; i < 10; i++) {
    
                        while (resource.getFlag() != 1) {
                            conditionA.await();
                        }
    
                        resource.print(5, "AA");
    
                        resource.setFlag(2);
    
                        conditionB.signal();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }, "A").start();
    
            new Thread(() -> {
                lock.lock();
                try {
    
                    for (int i = 0; i < 10; i++) {
    
                        while (resource.getFlag() != 2) {
                            conditionB.await();
                        }
                        resource.print(10, "BB");
    
                        resource.setFlag(3);
    
                        conditionC.signal();
                    }
    
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }, "B").start();
    
            new Thread(() -> {
                lock.lock();
                try {
    
                    for (int i = 0; i < 10; i++) {
    
                        while (resource.getFlag() != 3) {
                            conditionC.await();
                        }
                        resource.print(15, "CC");
    
                        resource.setFlag(1);
    
                        conditionA.signal();
                    }
    
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }, "C").start();
        }
    }
    
    
    class Resource {
        private int flag = 1;
    
        public int getFlag() {
            return flag;
        }
    
        public void setFlag(int flag) {
            this.flag = flag;
        }
    
        public void print(int count, String content) {
            for (int i = 0; i < count; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + content + "\t" + (i + 1));
            }
        }
    }
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容