线程之间的通信 笔记

线程之间的通信 笔记

  1. 先A线程工作 再B线程工作

    思路:使用对象锁,A先占用对象锁,使用后释放再给B

    public class Test {
          
          
        private static Object lock = new Object();
        static class ThreadA implements Runnable {
          
          
            @Override
            public void run() {
          
          
                synchronized (lock) {
          
          
                    for (int i = 0; i < 100; i++) {
          
          
                        System.out.println("Thread A " + i);
                    }
                }
            }
        }
        static class ThreadB implements Runnable {
          
          
            @Override
            public void run() {
          
          
                synchronized (lock) {
          
          
                    for (int i = 0; i < 100; i++) {
          
          
                        System.out.println("Thread B " + i);
                    }
                }
            }
        }
        public static void main(String[] args) throws InterruptedException {
          
          
            new Thread(new ThreadA()).start();
            new Thread(new ThreadB()).start();
        }
    }
    
  2. A线程打印偶数,B线程打印奇数

    思路:利用volatile+synchronized,因为a++不是原子操作,要加锁

    public class Test {
          
          
        private static Object lock = new Object();
        private static volatile int a = 0;
        static class ThreadA implements Runnable {
          
          
            @Override
            public void run() {
          
          
                while(a<100){
          
          
                    if(a%2==1){
          
          
                        try {
          
          
                            System.out.println("ThreadA: " + a);
                            synchronized (lock){
          
          
                                a++;
                            }
                        } catch (Exception e) {
          
          
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        static class ThreadB implements Runnable {
          
          
            @Override
            public void run() {
          
          
                while(a<100){
          
          
                    if(a%2==0){
          
          
                        try {
          
          
                            System.out.println("ThreadB: " + a);
                            synchronized (lock){
          
          
                                a++;
                            }
                        } catch (Exception e) {
          
          
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        public static void main(String[] args) {
          
          
            new Thread(new ThreadA()).start();
            new Thread(new ThreadB()).start();
        }
    }
    

猜你喜欢

转载自blog.csdn.net/qq_41454682/article/details/107661333