java多线程 更优雅的实现线程同步:交替打印AB LockSupport实现

Posted caijiwdq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程 更优雅的实现线程同步:交替打印AB LockSupport实现相关的知识,希望对你有一定的参考价值。

一 问题概述

线程或者进程之间有两种关系 同步和互斥,我们通常实现同步方法是使用线程的等待唤醒机制,而等待唤醒机制的使用是建立在互斥的继承上的。但是同步线程并不一定是必须要实现互斥的。比如一个线程打印A,一个线程打印B。这两个线程就没有互斥关系,但是提出这么个需求:交替打印A、B 。我们一般的解决方案,往往要使用wait()/notify机制。

 

 

二 LockSupport 介绍

LockSupport作为一个工具类,主要学习它的方法。

park():在线程内调用,表示当前线程自我阻塞,直到获得许可证

park(线程变量):让指定的线程获得许可证。

一看这两个方法的定义,显然可以利用这两个方法实现线程的顺序调用(同步)

 

三 两种思路实现交替打印A/B

等待唤醒机制:

/**
 * @program: test
 * @description: 交替打印A/B 等待唤醒机制
 * @author:
 * @create: 2019-07-22 14:28
 */
public class Test3 
   static  class MyRun implements Runnable 
        static int i = 0;
        @Override
        public synchronized  void run() 
            for (int j = 0; j < 10; j++) 
                if(i%2==0)
                    System.out.println(Thread.currentThread().getName()+":A");
                else
                    System.out.println(Thread.currentThread().getName()+":B");
                i++;
                this.notifyAll();
                try 
                    if(i>=19)
                        Thread.sleep(10);
                    else
                        this.wait();
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
            
        
    

    public static void main(String[] args) 
        MyRun myRun = new MyRun();
        Thread a = new Thread(myRun);
        Thread b = new Thread(myRun);
        a.start();
        b.start();
    

  

LockSupport 实现

/**
 * @program: test
 * @description:交替打印A,B LockSupport实现
 * @author:
 * @create: 2019-07-22 14:03
 */
public class Test2 
     static Thread a=null;
    static  Thread b=null;
    public static void main(String[] args) 
        a= new Thread(new Runnable() 
            @Override
            public void run() 

                for (int i = 0; i < 10; i++) 
                    LockSupport.park();
                    System.out.println(Thread.currentThread().getName()+":B");
                    LockSupport.unpark(b);
                
            
        );
       b=new Thread((new Runnable() 
            @Override
            public void run() 
                for (int i = 0; i < 10; i++) 
                    System.out.println(Thread.currentThread().getName()+":A");
                    LockSupport.unpark(a);
                    LockSupport.park();
                
            
        ));
        a.start();
        b.start();

    

  

以上是关于java多线程 更优雅的实现线程同步:交替打印AB LockSupport实现的主要内容,如果未能解决你的问题,请参考以下文章

多线程交替打印ABC的多种实现方法

使用A线程打印1-52,B线程打印A-Z,要求按照12A34B56C....5152Z的顺序进行交替打印

面试题:用程序实现两个线程交替打印 0~100 的奇偶数

java 多线程–线程交替

经典面试题——两个线程交替打印奇数和偶数

java多线程:结合多线程交替打印10次abc实例,对wait/notify使用的彻底理解