看到一道关于多线程题:如何实现两个线程交替打印数字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
分享到:
相关推荐
1. 实现一个类ThreadMock(模拟线程),用来模仿Thread类,该类具有以下特征: ... 两个线程交替打印。例如第一个线程打印1,接着第二个线程打印100,接着第一个线程打印2。。。。。。。。依此类推。
启动两个线程,一个线程打印1~52,另一个线程打印A~Z
java10个线程按照顺序打印1-100
C#多线程打印任意范围的数字,使用autoresetevent线程排序打印,源码,经过本人实际测试,可直接运行。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
主要介绍了Java实现多线程轮流打印1-100的数字操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
C# 多线程互斥 两个线程交替工作 C#多线程互斥,两个线程交替工作,如上图所示,挺有意思的。
vc++ 多线程教程---线程通信--利用事件对象,线程同步--使用信号量,线程同步--使用互斥量,线程同步--使用临界区
java基础教程301集287 两个线程交替打印.mp4
请使用继承Thread类的方式定义两个线程,一个线程可以计算1--100所有数字的累加和,另一个线程可以计算1--1000所有数字的累加和,每个线程计算完毕后各自打印计算结果,格式例如:”xxx线程计算1--100的累加和,结果...
继承Thread类 1 实现Runable接口 ...3 必须重写run 方法:里面放置的实际的线程体 4 启动线程: 5 创建Thread对象 6 调用Thread对象的start 方法启动线程 7 在子类中定义static静态变量实现资源共享
实现Runable接口的方式: 1创建实现Runable接口的实现类:必须实现run 方法 2创建1中对应的Runable接口的实现对象 3创建Thread对象 利用Thread Runable target 4调用Thread类的start 方法启动线程
java多线程按需交替执行,java新特性。
Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程执行完的五种方法 Java多线程--等待所有子线程...
java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...
一个线程捕获另外一个线程的异常1---马克-to-win java视频
一个线程捕获另外一个线程的异常2---马克-to-win java视频
.......................................JAVA线程、线程池资料----下载不扣分,回帖加1分,欢迎下载,童叟无欺JAVA线程、线程池资料----下载不扣分,回帖加1分,欢迎下载,童叟无欺JAVA线程、线程池资料----下载不...
一个线程打印123,另一个打印456,最终结果是打印123 456 123 45
请使用“匿名Runnable”子类的方式实现线程,线程中计算1--500所有数字的累加和,并打印计算结果