线程通信问题
Posted liuyi13535496566
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程通信问题相关的知识,希望对你有一定的参考价值。
/**
* 现在两个线程,可以操作初始值为零的一个变量,实现一个线程对该变量加1,一个线程对该变量减1,交替,来10轮。
* 1 多线程编程工程化模板-上
* 1.1 线程 操作 资源类
* 1.2 高内聚 低耦合
*
* 2 多线程编程工程化模板-下
* 2.1 判断
* 2.2 干活
* 2.3 通知
*
* 3 多线程中的判断问题,也即不要避免:虚假唤醒
* 用while
*/
class ShareData {
private int number = 0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void increment()throws Exception
{
lock.lock();
try
{
//1 判断
while(number != 0)
{
condition.await();//this.wait(); //A C
}
//2 干活
++number;
System.out.println(Thread.currentThread().getName()+" "+number);
//3 通知
condition.signalAll();//this.notifyAll();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void decrement()throws Exception
{
lock.lock();
try
{
//1 判断
while(number == 0)
{
condition.await();//this.wait(); //A C
}
//2 干活
--number;
System.out.println(Thread.currentThread().getName()+" "+number);
//3 通知
condition.signalAll();//this.notifyAll();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
/* public synchronized void increment()throws Exception
{
//1 判断
while(number != 0)
{
this.wait(); //A C
}
//2 干活
++number;
System.out.println(Thread.currentThread().getName()+" "+number);
//3 通知
this.notifyAll();
}
public synchronized void decrement()throws Exception
{
//1 判断
while(number == 0)
{
this.wait();
}
//2 干活
--number;
System.out.println(Thread.currentThread().getName()+" "+number);
//3 通知
this.notifyAll();
}*/
}
public class ProdConsumerDemo {
public static void main(String[] args)
{
ShareData sd = new ShareData();
new Thread(() -> {
for (int i = 1; i <=10; i++)
{
try {
sd.increment();
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
}
},"A").start();
new Thread(() -> {
for (int i = 1; i <=10; i++)
{
try {
sd.decrement();
Thread.sleep(300);
} catch (Exception e) {
e.printStackTrace();
}
}
},"B").start();
new Thread(() -> {
for (int i = 1; i <=10; i++)
{
try {
sd.increment();
Thread.sleep(400);
} catch (Exception e) {
e.printStackTrace();
}
}
},"C").start();
new Thread(() -> {
for (int i = 1; i <=10; i++)
{
try {
sd.decrement();
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
},"D").start();
}
}
以上是关于线程通信问题的主要内容,如果未能解决你的问题,请参考以下文章