`

使用synchronized和Condition三线程轮流打印A,B,C示例

阅读更多
    ReentrantLock并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能。当需要一些高级功能时才使用ReentrantLock,包括定时的锁等待,可中断的锁等待,公平性,锁绑定多个条件以及实现非块结构的加锁。否则,还是应该优先使用内置锁synchronized。synchronized是JVM的内置特性,可以进行一些优化。比如对线程封闭锁对象的锁消除优化,通过增加锁粒度来消除内置锁的同步等。
   
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class MultiThreadPrint
{

    public static void main(String[] args)
    {
        init();
    }

    private static void init()
    {
        ExecutorService executor = Executors.newFixedThreadPool(3);
        final Print print = new SynchronizedPrint();
        // final Print print = new ConditionPrint();

        executor.execute(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    Thread.currentThread().setName("thread A");
                    print.printA();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        });
        executor.execute(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    Thread.currentThread().setName("thread B");
                    print.printB();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        });

        executor.execute(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    Thread.currentThread().setName("thread C");

                    print.printC();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        });
        try
        {
            Thread.sleep(20*1000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        executor.shutdownNow();

    }

    interface Print
    {
        void printA() throws InterruptedException;

        void printB() throws InterruptedException;

        void printC() throws InterruptedException;

    }

    static class SynchronizedPrint implements Print
    {
        int flag = 1;

        @Override
        public void printA() throws InterruptedException
        {
            while (true)
            {
                synchronized (this)
                {
                    while (flag != 1)
                    {
                        this.wait();
                    }
                    System.out.println(Thread.currentThread().getName() + " prints " + "A");
                    Thread.sleep(800);
                    flag = 2;
                    notifyAll();
                }
            }

        }

        @Override
        public void printB() throws InterruptedException
        {
            while (true)
            {
                synchronized (this)
                {
                    while (flag != 2)
                    {
                        this.wait();
                    }
                    System.out.println(Thread.currentThread().getName() + " prints " + "B");
                    Thread.sleep(800);
                    flag = 3;
                    notifyAll();
                }
            }
        }

        @Override
        public void printC() throws InterruptedException
        {
            while (true)
            {
                synchronized (this)
                {
                    while (flag != 3)
                    {
                        this.wait();
                    }
                    System.out.println(Thread.currentThread().getName() + " prints " + "C");
                    Thread.sleep(800);
                    flag = 1;
                    notifyAll();
                }
            }

        }

    }

    static class ConditionPrint implements Print
    {
        final ReentrantLock lock = new ReentrantLock();
        final Condition cond1 = lock.newCondition();
        final Condition cond2 = lock.newCondition();
        final Condition cond3 = lock.newCondition();
        int flag = 1;

        public void printA() throws InterruptedException
        {
            while (true)
            {
                lock.lock();
                try
                {
                    while (flag != 1)
                    {
                        cond1.await();
                    }
                    System.out.println(Thread.currentThread().getName() + " prints " + "A");
                    Thread.sleep(800);
                    flag = 2;
                    cond2.signal();
                }
                finally
                {
                    lock.unlock();
                }
            }
        }

        public void printC() throws InterruptedException
        {
            while (true)
            {
                lock.lock();
                try
                {
                    while (flag != 2)
                    {
                        cond2.await();
                    }
                    System.out.println(Thread.currentThread().getName() + " prints " + "B");
                    Thread.sleep(800);
                    flag = 3;
                    cond3.signal();
                }
                finally
                {
                    lock.unlock();
                }
            }

        }

        public void printB() throws InterruptedException
        {
            while (true)
            {
                lock.lock();
                try
                {
                    while (flag != 3)
                    {
                        cond3.await();
                    }
                    System.out.println(Thread.currentThread().getName() + " prints " + "C");
                    Thread.sleep(800);
                    flag = 1;
                    cond1.signal();
                }
                finally
                {
                    lock.unlock();
                }
            }
        }
    }
}


控制台输出:
thread A prints A
thread B prints B
thread C prints C
thread A prints A
thread B prints B
thread C prints C
thread A prints A
thread B prints B
thread C prints C
。。。。
分享到:
评论

相关推荐

    java课程设计 三线程接力

    在Java课程设计中,"三线程接力"是一个典型的多线程编程问题,它涉及到并发控制、线程间协作以及时间间隔的精确控制。在这个项目中,我们有三个颜色的按钮——红色、蓝色和绿色,它们分别在特定的时间间隔内进行操作...

    三线程分别显示各自时间

    标题提到的"三线程分别显示各自时间"是一个典型的多线程示例,它涉及到如何创建和控制多个线程来按照特定的时间间隔执行任务。下面将详细介绍如何实现这个功能。 首先,我们需要了解Java中的线程基础。在Java中,...

    java多线程每个线程挨着打印ABC的4种实现方式

    java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...

    三线程随机显示26个字母

    在本文中,我们将深入探讨如何使用Java编程语言实现一个三线程系统,该系统能够随机地在界面上显示26个英文字母。这个任务的关键在于理解和应用多线程概念,以及如何同步线程以避免数据竞争和死锁。首先,我们需要...

    java同步synchronized关键字用法示例

    - **代码块同步:** 也可以使用`synchronized`关键字来同步代码块,这样可以更细粒度地控制同步范围,提高程序性能。 ```java public void method() { synchronized (object) { // 代码块 } } ``` 这里的`object...

    synchronized的几种示例

    本文将深入探讨`synchronized`的几种使用示例,包括方法加锁、代码块加锁(针对`this`和对象)以及静态方法加锁。 1. **方法加锁** 当在实例方法前使用`synchronized`关键字时,它会锁定当前对象的监视器,只有...

    java_synchronized详解

    - **解释**:线程`A`和线程`B`共享同一个`Thread1`实例`t1`,因此当线程`A`获取到`t1`的锁并执行`synchronized(this)`内的代码时,线程`B`将被阻塞,直到线程`A`释放锁。 2. **同步代码块与非同步代码块的访问** ...

    java多线程之A线程等B、C线程都执行完在执行的结果示例

    在这个场景中,我们关注的是一个特定的多线程问题:A线程需要等待B线程和C线程执行完毕后再开始执行,同时避免A线程无休止地检查状态导致的CPU空耗。 首先,我们需要理解Java中线程间的协作机制。Java提供了多种...

    synchronized用法大全实例

    本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ### 1. 同步方法 同步方法是通过在方法声明前加上`synchronized`关键字实现的。这样,同一时间只有一个线程可以执行该...

    子线程操作主线程的示例

    主线程通常负责用户界面的更新和事件处理,而子线程则用于执行耗时的任务,以避免阻塞UI。本示例将深入探讨如何在Java或C#等支持多线程的编程语言中,安全地从子线程操作主线程。 首先,我们需要理解线程同步的概念...

    Java中使用synchronized关键字实现简单同步操作示例

    Java中的`synchronized`关键字是用于实现线程同步的关键工具,其目的是确保在多线程环境中,同一时刻只有一个线程能够执行特定的代码块或方法,从而避免数据竞争和并发问题。下面将详细介绍`synchronized`关键字的三...

    JAVA synchronized详解

    可以看到,线程A先执行了`synchronized`代码块中的所有循环,然后线程B才开始执行,这证明了`synchronized`能够保证同一时间只有一个线程执行。 ##### 示例2:同步代码块 在第二个例子中,我们定义了一个`Thread2`...

    Java使用synchronized实现互斥锁功能示例

    Java使用synchronized实现互斥锁功能示例 在Java编程语言中,synchronized关键字是实现互斥锁功能的主要手段。互斥锁是一种机制,用于控制多个线程访问共享资源的顺序,从而避免因为资源竞争而导致的程序错误。在...

    Java synchronized使用案例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。这个关键词提供了互斥锁机制,防止多个线程同时执行同一段代码,确保了线程安全。 一、`...

    synchronized关键字的用法详解

    当两个线程`A`和`B`分别启动时,它们都将尝试执行该同步代码块。根据`synchronized`的特性,一次只有一个线程能够执行同步代码块。因此,我们可以观察到输出结果中线程`A`先执行完所有的循环之后,线程`B`才开始执行...

    [JAVA][synchronized的使用]

    总结,`synchronized`是Java中实现线程安全的关键工具,理解其工作原理和使用方式对于编写高效、安全的多线程程序至关重要。然而,在实际应用中,我们需要根据具体场景选择最合适的并发控制手段,平衡性能和安全性。

    java里面synchronized用法.doc

    四、synchronized 关键字的使用示例 以下是一个简单的示例代码,演示了 synchronized 关键字的使用: ```java public class TxtThread implements Runnable { int num = 100; String str = new String(); ...

    Java-synchronized详解.docx

    Java synchronized 详解 Java 中的同步机制是多线程编程中最重要的概念之一。它允许开发者控制多个...通过使用 synchronized,可以确保在同一时间只有一个线程可以访问共享资源,以防止数据不一致和 race condition。

    volatile和synchronized的区别

    在Java中,为了保证多线程环境下数据的一致性和安全性,可以采用两种主要的方法:`synchronized`和`volatile`。 ##### 1. synchronized关键字 `synchronized`是一种基于锁的同步机制,它可以应用于方法或者代码块...

    java锁机制Synchronizedjava锁机制Synchronized

    这些房间可以被分为两种:上锁房间(synchronized 方法)和不上锁房间(普通方法)。每个对象都有一个钥匙(key),该钥匙可以打开所有上锁的房间。 Synchronized 方法 当一个线程想要进入一个上锁房间时,它需要...

Global site tag (gtag.js) - Google Analytics