Condition类的signal则是唤醒被Condition类使用await作用的那个线程,它会有针对性的唤醒线程,而不是随机唤醒一个线程,以保证线程执行的顺序:
package com.yzh.job.test;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Thread3 {
public static void main(String[] args) {
final G g = new G();
Thread t1 = new Thread(){
@Override
public void run(){
String str = "Thread1";
g.show1(str);
}
};
Thread t2 = new Thread(){
@Override
public void run(){
String str = "Thread2";
g.show2(str);
}
};
Thread t3 = new Thread(){
@Override
public void run(){
String str = "Thread3";
g.show3(str);
}
};
t1.start();
t2.start();
t3.start();
}
}
class G{
//注意要写在方法外面
Lock lock = new ReentrantLock();
//有几个线程就定义几个condition对象
Condition c1 = lock.newCondition();
Condition c2 = lock.newCondition();
Condition c3 = lock.newCondition();
int i = 3;
public void show1(String str){
lock.lock();
if(i != 3){
try {
c3.await();//相当于锁住当前这一个线程,释放锁
} catch (Exception e) {
e.printStackTrace();
}
}
for(int i = 0;i<1;i++){
System.out.println(str);
}
i = 2;
//唤醒c2那一个作用的线程:指定线程唤醒
try {
c2.signal();
} catch (Exception e) {
e.printStackTrace();
}
lock.unlock();
}
public void show2(String str){
lock.lock();
if(i != 2){
try {
c2.await();//相当于锁住当前这一个线程,释放锁
} catch (Exception e) {
e.printStackTrace();
}
}
for(int i = 0;i<2;i++){
System.out.println(str);
}
i = 1;
//唤醒c1那一个作用的线程:指定线程唤醒
try {
c1.signal();
} catch (Exception e) {
e.printStackTrace();
}
lock.unlock();
}
public void show3(String str){
lock.lock();
if(i != 1){
try {
//释放当前锁
c1.await();//相当于锁住当前这一个线程,释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i = 0;i<3;i++){
System.out.println(str);
}
i = 3;
//唤醒c3那一个作用的线程:指定线程唤醒
try {
c3.signal();
} catch (Exception e) {
e.printStackTrace();
}
lock.unlock();
}
}