问题描述
ThreadA、ThreadB、ThreadC,ThreadA 用于初始化数据 i,只有当i初始化完成之后再让ThreadB和ThreadC获取到初始化后的变量i。
分析过程如下:
考虑到多线程的不确定性,因此我们不能确保ThreadA就一定先于ThreadB和ThreadC前执行,就算ThreadA先执行了,我们也无法保证ThreadA什么时候才能将变量i给初始化完成。因此我们必须让ThreadB和ThreadC去等待ThreadA完成任何后发出的消息。
现在需要解决两个难题,一是让 ThreadB 和 ThreadC 等待 ThreadA 先执行完,二是 ThreadA 执行完之后给ThreadB和ThreadC发送消息。
解决方案:
是使用纯Java API的Semaphore类来控制线程的等待和释放,
//设置semaphore值,初始值给0
Semaphore semaphore = new Semaphore(0);
Thread threadA= new Thread(new Runnable() {
@Override
public void run() {
try {
//模拟耗时操作
Thread.sleep(1000);
//给定i值
i=10;
//因为另外有两个线程给定 2
semaphore.release(0);
} catch (InterruptedException e) {
System.out.println("A异常"+e);
e.printStackTrace();
}
}
});
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
try {
//有值则继续,无则不执行
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b值i>>>>>>"+i);
}
});
Thread threadC = new Thread(new Runnable() {
@Override
public void run() {
try {
//有值则继续,无则不执行
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("值i>>>>>>"+i);
}
});
//三个线程同时执行
threadA.start();
threadB.start();
threadC.start();