一)线程之间的交替打印
使用线程Conditon进行线程之间通信
package com.itguigu.demo1;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @project_name:juc
* @date:2019/10/10:14:54
* @author:shinelon
* @Describe: 线程交替打印
*/
public class AlterentDemo
{
public static void main(String[] args)
{
Alternate ad = new Alternate();
//开启线程
new Thread(() ->
{
for (int i = 0; i < 20; i++)
{
ad.loopA(i);
}
}, "A").start();
new Thread(() ->
{
for (int i = 0; i < 20; i++)
{
ad.loopB(i);
}
}, "B").start();
new Thread(() ->
{
for (int i = 0; i < 20; i++)
{
ad.loopC(i);
}
}, "C").start();
}
}
class Alternate
{
private int num = 1;
private Lock lock = new ReentrantLock();
//获取三个线程锁
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
public void loopA(int totalLoop)
{
lock.lock();
try
{
if (num != 1)
{
//线程等待
condition1.await();
}
for (int i = 0; i < 1; i++)
{
System.out.println(Thread.currentThread().getName() + "\tA\t" + totalLoop);
}
//打印完毕交出去线程执行权
num = 2;
condition2.signal();
} catch (Exception e)
{
e.printStackTrace();
} finally
{
lock.unlock();
}
}
public void loopB(int totalLoop)
{
lock.lock();
try
{
if (num != 2)
{
//线程等待
condition2.await();
}
for (int i = 0; i < 1; i++)
{
System.out.println(Thread.currentThread().getName() + "\tB\t" + totalLoop);
}
//打印完毕交出去线程执行权
num = 3;
condition3.signal();
} catch (Exception e)
{
e.printStackTrace();
} finally
{
lock.unlock();
}
}
public void loopC(int totalLoop)
{
lock.lock();
try
{
if (num != 3)
{
//线程等待
condition3.await();
}
for (int i = 0; i < 1; i++)
{
System.out.println(Thread.currentThread().getName() + "\tC\t" + totalLoop);
System.out.println("======");
}
//打印完毕交出去线程执行权
num = 1;
condition1.signal();
} catch (Exception e)
{
e.printStackTrace();
} finally
{
lock.unlock();
}
}
}
打印的效果