`
richard_lee
  • 浏览: 16423 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

两个线程交替打印数字-Condition唤醒与等待

阅读更多
看到一道关于多线程题:如何实现两个线程交替打印数字0-9?

首先我们会想到要实现交替打印,那么就要其中一个执行的时候,另外一个处于等待状态,当该线程执行完的时候,唤醒另外一个。如此执行就可实现。

我们可以通过wait和notify对线程进行状态控制,并且我们需要两个监视器分别对这两个线程的wait和notify控制。如果用synchronized的wait和notify,实现起来比较麻烦(只有wait在相同的锁和监视器上的线程,才能被唤醒),因为对于同一个锁,我们需要不同的监视器进行控制wait和notify。这种情况下,Condition可以比较好的支持.
Condition:能够更加精细的控制多线程的等待与唤醒,并且对于同一个锁可以创建多个Condition监视器。

代码如下:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
 * 两个线程交替打印1-10数字
 * @author happigfemale
 *
 */
public class ThreadTest {
	//可重入锁
	private ReentrantLock lock = new ReentrantLock();
	//Condition信号1
	private Condition c1 = lock.newCondition();
	//Condition信号2
	private Condition c2 = lock.newCondition();
	private int count = 0;
	public void countMethod(){
		Thread t1 = new Thread("T1"){
			public void run(){
				while(count < 10){
					lock.lock();
					try {
						System.out.println(Thread.currentThread().getName() + ":" +count);
						count ++;
						c1.await();//c1将线程1从运行状态->阻塞等待
						
						c2.signal();//c2将线程2从阻塞等待->唤醒状态
						
						
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}finally{
						lock.unlock();
					}
				}
			}
		};
		Thread t2 = new Thread("T2"){
			public void run(){
				while(count < 10){
					lock.lock();
					try {
						System.out.println(Thread.currentThread().getName() + ":" +count);
						count ++;
						c1.signal();//c1将线程1从阻塞等待->唤醒状态
						c2.await();//c2将线程2从运行状态->阻塞等待
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}finally{
						lock.unlock();
					}
					
				}
			}
		};
		
		//线程t1启动
		t1.start();
		while(count == 0){//保证t1先执行
			;
		}
		//线程t2启动
		t2.start();
		
	}
	public static void main(String[] args) {
		new ThreadTest().countMethod();
	}
}


执行结果:
T1:0
T2:1
T1:2
T2:3
T1:4
T2:5
T1:6
T2:7
T1:8
T2:9
分享到:
评论

相关推荐

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

    这样,两个线程就可以交替打印数字,保证了顺序的正确性。 在`main()`函数中,我们创建了两个线程`t1`和`t2`,分别执行`printeven()`和`printodd()`,最后使用`join()`等待两个线程执行完毕,确保程序不会提前结束...

    Java多线程通信:交替打印ABAB实例

    在这个场景下,我们关注的是如何实现两个线程交替打印"A"和"B",形成"ABABAB"这样的序列。 在给出的示例中,我们创建了一个`PrintAB`类,包含两个方法`printA()`和`printB()`,这两个方法都是`synchronized`的,...

    Java多线程-线程间的通信

    案例描述:使用两个线程交替打印数字1-100。 **分析**: 1. **创建线程**:使用实现Runnable接口的方式来创建线程。 2. **解决线程安全问题**:由于两个线程需要共享同一个计数器变量`number`,因此需要对计数器的...

    python使用threading.Condition交替打印两个字符

    以下是一个简单的例子,演示如何使用`threading.Condition`实现两个线程交替打印字符“A”和“B”。 ```python import threading import time class AlternatingPrinter: def __init__(self): self.condition =...

    Java多线程-多线程知识点总结和企业真题

    - 在单核CPU环境下,多线程表现为并发执行,即多个线程交替执行,而不是同时执行。 - 多核CPU环境下,可以真正实现并行执行,即多个线程可以同时执行,充分利用多核的优势。 ##### (2)创建多线程的基本方式 1....

    Java 等待唤醒机制

    6. **示例代码**:以下是一个简单的等待唤醒机制示例,展示了如何在两个线程之间使用`wait()`和`notify()`: ```java public class WaitNotifyDemo { private final Object lock = new Object(); private boolean...

    Python线程协作threading.Condition实现过程解析

    如果没有`Condition`进行同步,这两个线程可能会交错执行,导致对话逻辑混乱。 总结来说,`threading.Condition`在Python多线程环境中提供了一种灵活的同步机制,通过控制线程的执行顺序和等待状态,确保线程安全地...

    Solaris2.4多线程编程

    并发性是指在一段时间内,多个线程交替执行,而并行性则是指在同一时刻,多个线程在不同的处理器上同时执行。在单处理器系统中,通过线程调度实现并发,而在多处理器系统中,可以真正实现并行执行,提高处理能力。 ...

    每日练习:Java中的线程之线程间的通信教程.doc

    例如,有两个线程print1和print2,它们会根据flag的值来决定哪个线程运行。当flag为1时,print2运行并将flag设为0,唤醒等待的print1;反之,当flag为0时,print1运行并将flag设为1,唤醒print2。这种方法需要配合...

    线程实验java

    - **Exchanger**:用于两个线程间的数据交换,当双方都准备好数据后才进行交换。 - **BlockingQueue**:阻塞队列,线程在队列为空时会阻塞,直到有元素可用;队列满时,生产者线程也会被阻塞。 - **CyclicBarrier...

    java课程设计线程同步五子棋.zip

    在这个五子棋游戏中,可能在落子操作或者检查胜负的函数中使用了同步块,防止两个线程同时修改棋盘状态。 2. **同步方法(Synchronized Method)**:与同步块类似,将`synchronized`关键字应用于方法,使得整个方法...

    多线程控制红绿灯变化

    1. **线程同步**:为了确保红绿灯交替的正确性,需要对线程进行同步,防止两个线程同时运行。这可以使用锁(如Java的`synchronized`关键字)、条件变量(`Condition`)或信号量(Semaphore)来实现。 2. **定时器**...

    Java多线程的小例子——吃包子

    5. **条件变量(Condition)**:在Java的`java.util.concurrent.locks`包中,`Condition`接口提供了等待和唤醒线程的能力,可以用于实现特定的同步逻辑。比如,当包子不足时,顾客线程可能需要等待,直到厨师制作好...

    多线程实例

    2. **并发与并行**:并发是指多个线程在一段时间内交替执行,而并行则是指多个线程在同一时刻执行。在单核处理器中,只能实现并发;而在多核处理器中,可以实现并行。 3. **线程状态**:线程有新建(New)、就绪...

    多线程简易实现生产者消费者模式

    6. **启动线程**:创建多个生产者和消费者线程,然后启动它们,线程会按照规则交替执行,实现生产与消费的平衡。 在提供的文件"stack"中,可能包含了一个使用栈作为缓冲区的生产者消费者模式实现。栈具有后进先出...

    互斥锁、条件变量、信号量总结

    例如,在打印任务的例子中,两个线程通过共享变量、互斥锁和条件变量协同工作,交替打印数字,确保打印的顺序正确。条件变量的应用场景通常涉及到多个线程的协作,当某个线程发现条件不满足时,它会释放资源并等待,...

    juc-1(2).docx

    2) 示例代码展示了两个线程交替对共享数据进行加减操作,使用 `synchronized` 关键字保证原子性和互斥访问,配合 `wait()` 和 `notifyAll()` 进行线程间的调度。 3) 为了避免虚假唤醒,应使用 `while` 循环来检查...

    JAVA并发编程实践

    - **并发(Concurrency)**:是指在一段时间内,程序中的多个线程交替执行,给人一种同时执行的感觉。 - **并行(Parallelism)**:是指同一时刻有多个处理器分别执行不同的任务。 在Java并发编程中,我们通常关注的是...

    深入学习python中的并发(一)---线程

    在第一个例子中,两个线程`thread1`和`thread2`交替打印奇偶数,这展示了如何使用条件变量来协调线程的执行。每个线程在打印后会释放自己的条件变量,并通知另一个线程可以开始执行。 第二个例子展示了如何实现一个...

Global site tag (gtag.js) - Google Analytics