zoukankan      html  css  js  c++  java
  • java多线程之Lock线程同步

    1、线程同步:

    package cn.itcast.heima2;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    
    public class LockTest {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            new LockTest().init();
        }
        
        private void init(){
            final Outputer outputer = new Outputer();
            new Thread(new Runnable(){
                @Override
                public void run() {
                    while(true){
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        outputer.output("zhangxiaoxiang");
                    }
                    
                }
            }).start();
            
            new Thread(new Runnable(){
                @Override
                public void run() {
                    while(true){
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        outputer.output("lihuoming");
                    }
                    
                }
            }).start();
            
        }
    
        static class Outputer{
            Lock lock = new ReentrantLock();
            public void output(String name){
                int len = name.length();
                lock.lock();
                try{
                    for(int i=0;i<len;i++){
                        System.out.print(name.charAt(i));
                    }
                    System.out.println();
                }finally{
                    lock.unlock();
                }
            }
        }
    }
    View Code

    2、ReentrantLock的Condition的await,signal的应用:

    package cn.itcast.heima2;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class ThreeConditionCommunication {
    
        public static void main(String[] args) {
            final Business business = new Business();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 1; i <= 50; i++) {
                        business.sub2(i);
                    }
                }
            }).start();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 1; i <= 50; i++) {
                        business.sub3(i);
                    }
                }
            }).start();
    
            for (int i = 1; i <= 50; i++) {
                business.main(i);
            }
        }
        static class Business {
            Lock lock = new ReentrantLock();
            Condition condition1 = lock.newCondition();
            Condition condition2 = lock.newCondition();
            Condition condition3 = lock.newCondition();
            private int shouldSub = 1;
    
            public void sub2(int i) {
                lock.lock();
                try {
                    while (shouldSub != 2) {
                        try {
                            condition2.await();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    for (int j = 1; j <= 10; j++) {
                        System.out.println("sub2 thread sequence of " + j
                                + ",loop of " + i);
                    }
                    shouldSub = 3;
                    condition3.signal();
                } finally {
                    lock.unlock();
                }
            }
    
            public void sub3(int i) {
                lock.lock();
                try {
                    while (shouldSub != 3) {
                        try {
                            condition3.await();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    for (int j = 1; j <= 20; j++) {
                        System.out.println("sub3 thread sequence of " + j
                                + ",loop of " + i);
                    }
                    shouldSub = 1;
                    condition1.signal();
                } finally {
                    lock.unlock();
                }
            }
    
            public void main(int i) {
                lock.lock();
                try {
                    while (shouldSub != 1) {
                        try {
                            condition1.await();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    for (int j = 1; j <= 100; j++) {
                        System.out.println("main thread sequence of " + j
                                + ",loop of " + i);
                    }
                    shouldSub = 2;
                    condition2.signal();
                } finally {
                    lock.unlock();
                }
            }
    
        }
    }
    View Code
  • 相关阅读:
    HTML超链接标签—链接QQ在线聊天
    超链接标签-QQ邮箱链接经验分享
    数据类型转换的事项和注释
    关键字、标识符、常量、变量的(定义)
    WendosiDOS命令的一些使用命令
    Map集合
    Set集合 HashSet集合 LInkHathSet集合
    增强for循环
    22_迭代器
    包装类
  • 原文地址:https://www.cnblogs.com/lbangel/p/3186589.html
Copyright © 2011-2022 走看看