`

lock+condition实现两个线程循环打印奇偶数:0~100

阅读更多
/**
 * @author lanwei 2018-05-19
 */
public class ConditonPrintAB {

    public static void main(String[] a) {
        PrintAB printAB = new PrintAB();
        new Thread(() -> printAB.print1()).start();
        new Thread(() -> printAB.print2()).start();
    }


    public static class PrintAB {

        private Lock lock = new ReentrantLock();

        private Condition c1 = lock.newCondition();

        private Condition c2 = lock.newCondition();

        private volatile int state = 0;

        /**
         * 打印奇数
         */
        public void print1() {
            print(1, c1, c2);
        }

        /**
         * 打印偶数
         */
        public void print2() {
            print(0, c2, c1);
        }

        public void print(int flag, Condition cuerrentConditon, Condition nextConditin) {
            for (; ; ) {
                try {
                    lock.lock();
                    // 状态判断
                    while (state % 2 == flag) {
                        cuerrentConditon.await();
                    }
                    if (state > 100) {
                        return;
                    }
                    System.out.println(Thread.currentThread().getName() + ": " + state++);
                    nextConditin.signal();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        }
    }
}

 

分享到:
评论

相关推荐

    多线程依次循环打印26个英文字母

    在这个"多线程依次循环打印26个英文字母"的问题中,我们主要关注如何在多个线程之间同步操作,确保字母按照顺序正确地输出。这里涉及了`条件队列`和`lock`两个关键概念。 首先,让我们理解一下`多线程`。在单核...

    C++11用两个线程轮流打印整数的实现方法

    本文将详细解析如何使用C++11的标准线程语法来实现两个线程轮流打印整数,其中一个线程打印奇数,另一个线程打印偶数,同时涉及到线程同步的关键技术——互斥量和条件变量。 首先,为了确保线程安全,我们需要使用...

    多线程 打印1-99,100-199

    根据实验需求,我们需要创建两个子线程,分别打印从 1 到 99 和从 100 到 199 的数字,并且这两个线程需要交替打印数字。 **3.1 创建打印线程** 首先,我们创建两个类 `Test1` 和 `Test2` 来代表两个子线程,它们...

    实现一个数据单元,包括学号和姓名两部分。编写两个线程,一个线程往数据单元中写,另一个线程往出读。要求每写一次就往出读一次。

    本实验的任务是设计并实现一个数据单元,该单元包含学号和姓名两个字段,并且使用两个线程,一个用于写入数据,另一个用于读取数据。这种设计模式被称为“生产者-消费者”问题,是多线程编程中的经典案例。 首先,...

    java10个线程按照顺序打印1-100

    本主题聚焦于如何使用Java实现10个线程按照顺序打印数字1到100。这种问题通常通过线程间通信和同步机制来解决,如`synchronized`关键字、`wait()`、`notify()`或`notifyAll()`方法,以及`Semaphore`、`CyclicBarrier...

    用C#实现的多线程同步打印文章(windows操作系统实验)

    在本实验中,我们创建了两个线程:下载线程和打印线程,分别处理文章的下载和打印操作。 文章下载线程的任务是从网络或者其他来源获取文章,并将其存储到内存中的缓冲区。这个过程可能涉及到网络I/O操作,通常比较...

    Nachos的线程管理模块升级

    在Nachos中,线程数据结构的升级包括添加"用户ID"和"线程ID"两个字段。用户ID用于标识线程所属的用户,而线程ID则是区分不同线程的唯一标识。在实现中,可以通过在`Thread`类中增加整型变量`tid`来存储线程ID,并...

    java实现两个线程交替打印的实例代码

    在本篇文章中,我们将使用两种方法来实现两个线程交替打印:使用 ReentrantLock 和 Condition 实现线程交替打印,以及使用 LinkedTransferQueue 实现线程交替打印。 使用 ReentrantLock 和 Condition 实现线程交替...

    Java有两种实现多线程的方式:通过Runnable接口、通过Thread直接实现,请掌握这两种实现方式,并编写示例程序。

    在上述两个示例中,我们通过观察输出结果可以看到,线程的执行并不是按顺序进行的,而是由操作系统的调度策略决定的。这意味着,即使在代码中定义了明确的执行流程,实际运行时,线程可能会被中断和重新调度。 ####...

    设计4个线程,其中两个对j增加,两个对j减少

    本示例中,我们创建了4个线程,其中两个线程负责递增变量`j`,另外两个线程负责递减`j`。这个设计主要展示了线程同步和竞争条件的概念。 首先,我们需要理解`Thread`类在Java中的作用。`Thread`是Java的内置类,...

    CC++多线程编程练习题大全

    9. **死锁**:当两个或更多线程相互等待对方释放资源而陷入僵局时,发生死锁。避免死锁需要遵循适当的策略,如避免循环等待,使用死锁预防或死锁避免算法。 10. **线程安全的数据结构**:C++标准库提供了一些线程...

    c#线程 lock用法

    `lock`语句是C#中用于实现线程同步的重要工具,主要是为了解决多个线程并发访问共享资源时可能出现的竞争条件(race condition)问题。在描述的场景中,`lock`关键字被用来确保在同一时间只有一个线程可以访问特定的...

    文件打印问题 (c++多线程实现)

    总的来说,“文件打印问题”的多线程实现是理解和掌握C++并发编程的一个好例子。它涉及到线程同步、互斥访问和资源管理,这些都是现代软件开发中的核心技能。通过学习和实践,开发者能够编写出更高效、更可靠的并发...

    Python应用实战:python多线程-多线程安全问题&lock与rlock.zip

    数据竞争是多线程环境中常见的问题,当两个或多个线程同时访问并修改同一份共享数据时,可能会导致数据的不一致性。例如,一个线程正在读取数据,而另一个线程同时修改了这个数据,那么读取线程获取到的数据可能是...

    JavaLock与Condition的理解Reentran

    Java Lock与Condition是Java并发编程中的重要概念,它们提供了比synchronized关键字更细粒度的控制,从而使得多线程程序的设计和管理更加灵活高效。本文将深入探讨ReentrantLock(可重入锁)和Condition的基本原理、...

    C++基于消息队列的多线程实现示例代码

    本实现主要涉及到几个知识点:std::lock_guard、std::unique_lock、std::condition_variable 和 std::function。通过示例代码,读者可以更好地理解 C++ 中基于消息队列的多线程实现。 六、结语 本文详细介绍了 C++...

    java 两个线程相互顺序输出

    标题“java 两个线程相互顺序输出”涉及的问题是如何在多线程环境下控制线程的执行顺序,使得两个线程可以按照特定的顺序交替打印输出。这通常涉及到线程同步和通信的概念。下面将详细解释这些知识点。 1. **线程...

    两个线程交替执行

    在上述代码中,我们可以看到两个线程 a 和 b,它们之间通过一个锁对象 LOCK 进行同步。线程 a 负责打印数字 1、2、3,而线程 b 负责打印数字 4、5、6。通过使用 synchronized 关键字,我们可以确保在某个时刻只有一...

    多线程实现多控制两个案例

    本篇文章将详细讲解如何通过多线程实现对两个任务的独立控制,以及如何进行线程同步,以确保数据的一致性。 首先,我们来看第一个案例:实现两个线程分别控制两个运动。在计算机编程中,线程可以被视为程序的执行流...

    Java+并发性和多线程

    - **死锁**:两个或更多线程相互等待对方释放资源,导致无法继续执行。 - **活锁**:线程不断地重试导致的循环等待,但没有线程真正进展。 - **饥饿**:线程虽然不会死锁,但由于各种原因,一直得不到执行机会。 ...

Global site tag (gtag.js) - Google Analytics