提示:这里我只是聊聊自己的理解,相当于自己记个笔记而已,如果有误,请指正。
使用上的区别:(如下图)

最大区别:Lock能实现精准通知,精准唤醒。
例子:多个线程,要求实现调用顺序A->B->C。具体实例:启动三个线程,要求A打印2次,B打印4次,C打印6次......循环5轮(笔试高频题)。
实现代码如下:
package com.xxx.thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Author:wrb
* @Date :2020/2/1/20:30
* @Describtion:
**/
public class Damo06 {
static int num= 1;
public static void main(String[] args) {
MyData myData = new MyData();
new Thread(()->{
for (int i=0;i<5;i++){
myData.print5();
}
},"A").start();
new Thread(()->{
for (int i=0;i<5;i++){
myData.print10();
}
},"B").start();
new Thread(()->{
for (int i=0;i<5;i++){
myData.print15();
}
},"C").start();
}
}
class MyData{
Lock lock = new ReentrantLock();
int state = 1;
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
public void print2(){
lock.lock();
try {
while (state!=1){
condition1.await();
}
for (int i=1;i<3;i++){
System.out.print(Thread.currentThread().getName()+i+"\t");
}
state=2;
condition2.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void print4(){
lock.lock();
try {
while (state!=2){
condition2.await();
}
for (int i=1;i<5;i++){
System.out.print(Thread.currentThread().getName()+i+"\t");
}
state=3;
condition3.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void print6(){
lock.lock();
try {
while (state!=3){
condition3.await();
}
for (int i=1;i<7;i++){
System.out.print(Thread.currentThread().getName()+i+"\t");
}
state=1;
condition1.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
测试结果:

努力奋斗,不负韶华!

本文介绍了一种使用Java的Lock和Condition实现线程间精确调度的方法,通过三个线程A、B、C的示例,展示了如何让它们按照指定顺序交替执行,每个线程分别打印2次、4次和6次,循环进行5轮。此方法适用于需要精确控制线程执行顺序的场景。
1098

被折叠的 条评论
为什么被折叠?



