java多线程-使用ReentrantLock实现线程的顺序执行
2017-03-27 09:17
811 查看
测试例子:
package serializer.pattern;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
volatile private static int nextPrintWho = 1;
private static ReentrantLock lock = new ReentrantLock();
final private static Condition conditionA = lock.newCondition();
final private static Condition conditionB = lock.newCondition();
final private static Condition conditionC = lock.newCondition();
public static void main(String[] args){
Thread threadA = new Thread(){
public void run(){
try {
lock.lock();
while(nextPrintWho != 1){
conditionA.await();
}
for(int i=0;i<3;i++){
System.out.println("ThreadA:"+(i+1));
}
nextPrintWho = 2;
conditionA.signalAll();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
};
Thread threadB = new Thread(){
public void run(){
try {
lock.lock();
while(nextPrintWho != 2){
conditionA.await();
}
for(int i=0;i<3;i++){
System.out.println("ThreadB:"+(i+1));
}
nextPrintWho = 3;
conditionA.signalAll();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
};
Thread threadC = new Thread(){
public void run(){
try {
lock.lock();
while(nextPrintWho != 3){
conditionA.await();
}
for(int i=0;i<3;i++){
System.out.println("ThreadC:"+(i+1));
}
nextPrintWho = 1;
conditionA.signalAll();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
};
Thread[] aArray = new Thread[5];
Thread[] bArray = new Thread[5];
Thread[] cArray = new Thread[5];
for(int i=0;i<5;i++){
aArray[i] = new Thread(threadA);
bArray[i] = new Thread(threadB);
cArray[i] = new Thread(threadC);
aArray[i].start();
bArray[i].start();
cArray[i].start();
}
}
}
package serializer.pattern;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
volatile private static int nextPrintWho = 1;
private static ReentrantLock lock = new ReentrantLock();
final private static Condition conditionA = lock.newCondition();
final private static Condition conditionB = lock.newCondition();
final private static Condition conditionC = lock.newCondition();
public static void main(String[] args){
Thread threadA = new Thread(){
public void run(){
try {
lock.lock();
while(nextPrintWho != 1){
conditionA.await();
}
for(int i=0;i<3;i++){
System.out.println("ThreadA:"+(i+1));
}
nextPrintWho = 2;
conditionA.signalAll();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
};
Thread threadB = new Thread(){
public void run(){
try {
lock.lock();
while(nextPrintWho != 2){
conditionA.await();
}
for(int i=0;i<3;i++){
System.out.println("ThreadB:"+(i+1));
}
nextPrintWho = 3;
conditionA.signalAll();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
};
Thread threadC = new Thread(){
public void run(){
try {
lock.lock();
while(nextPrintWho != 3){
conditionA.await();
}
for(int i=0;i<3;i++){
System.out.println("ThreadC:"+(i+1));
}
nextPrintWho = 1;
conditionA.signalAll();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
};
Thread[] aArray = new Thread[5];
Thread[] bArray = new Thread[5];
Thread[] cArray = new Thread[5];
for(int i=0;i<5;i++){
aArray[i] = new Thread(threadA);
bArray[i] = new Thread(threadB);
cArray[i] = new Thread(threadC);
aArray[i].start();
bArray[i].start();
cArray[i].start();
}
}
}
相关文章推荐
- Java 多线程 (PART XIX) 使用Condition实现线程的顺序执行
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没
- Java 多线程 (PART VII) 使用join()方法保证线程的执行顺序
- java使用CountDownLatch实现线程顺序执行
- java使用CountDownLatch实现线程顺序执行
- Java多线程系列四——控制线程执行顺序
- 三个线程轮流执行顺序打印ABC(二):使用Lock+Condition实现
- 用java传统线程方式实现多线程轮询执行问题
- 使用信号量来实现线程的先后执行顺序
- 三个线程轮流执行顺序打印ABC(一):使用Semaphore实现
- Java实现多线程经典问题:使用三个线程实现输出ABCABC循环
- 复习基础-JAVA多线程,基于Condition实现子线程、主线程顺序处理
- C#之使用AutoResetEvent实现线程的顺序执行
- Java多线程学习笔记1——线程的实现方式以及定时器的使用
- Javaの线程之多线程执行顺序
- Java多线程之~~~使用CountDownLatch来同步多个线程实现一个任务
- 三个线程轮流执行顺序打印ABC(三):使用Lock实现
- Java:多线程,使用同步锁(Lock)时利用Condition类实现线程间通信
- Java多线程与并发应用-(11)-用Lock+Condition实现1,2,3 三个模块按顺序执行。
- Java 多线程实现的三种方法,附两个线程执行不同的输出