线程-线程接力-多线程编程
本次使用的编译工具是idea
package lt.test01;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 多线程之间按照顺序的调用、实现a-b-c、三个线程启动要求
* aa打印5次、bb打印10次、cc打印15次
* aa打印5次、bb打印10次、cc打印15次
* 共计来5轮
*/
public class ThreadRelay {
private int number = 1;
private Lock lock = new ReentrantLock();
Condition con = lock.newCondition();
Condition con1 = lock.newCondition();
Condition con2 = lock.newCondition();
public void loapAA(int loop){
lock.lock();
try{
//判断
while(number !=1){
con.await();
}
//干活
for (int i = 1; i <= 5; i++) {
System.out.print(Thread.currentThread().getName()+"\t"+i+"\t当前是第:"+loop+"轮\n");
}
//线程的唤醒+改标记
number = 2;
con1.signal();
}catch(Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void loapBB(int loop){
lock.lock();
try{
//判断
while(number !=2){
con1.await();
}
//干活
for (int i = 1; i <= 10; i++) {
System.out.print(Thread.currentThread().getName()+"\t"+i+"\t当前是第:"+loop+"轮\n");
}
number = 3;
con2.signal();
}catch(Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void loapCC(int loop){
lock.lock();
try{
//判断
while(number !=3){
con2.await();
}
//干活
for (int i = 1; i <= 15; i++) {
System.out.print(Thread.currentThread().getName()+"\t"+i+"\t当前是第:"+loop+"轮 \n");
}
number =1 ;
con.signal();
}catch(Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public static void main(String[] args){
final ThreadRelay t = new ThreadRelay();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
t.loapAA(i);
}
}
},"AA").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
t.loapBB(i);
}
}
},"BB").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
t.loapCC(i);
}
}
},"CC").start();
}
}
本文来自博客园,作者:diligently,转载请注明原文链接:https://www.cnblogs.com/luo12828-foxmail/p/16964150.html

浙公网安备 33010602011771号