多线程 同步synchronized、通信wait、notify

末蓝、 2022-08-14 05:39 287阅读 0赞

/*
* 生产者将产品交给店员,二消费者从店员处取走产品;
* 店员持有的产品数量不超过20,如果超过20叫生产者停一下,少于20就继续生产;
* 如果店员持有的数量为0,让消费者稍等下,一有产品就通知消费者;
*
* 分析:
* 是否有涉及到多线程?有,生产者和消费者;
* 是否有涉及到共享数据?有,产品数量,别忘了线程安全;
* 是否有涉及到通信?有,生产者和消费者之间的通信;
*/
public class Test
{
public static void main(String[] args)
{
Clerk clerk = new Clerk();
Producter p = new Producter(clerk);
Customers c = new Customers(clerk);

Thread t1 = new Thread(p);
Thread t2 = new Thread(c);

t1.start();
t2.start();
}
}

//店员,管理商品数量;
class Clerk
{
int num = 0;
public synchronized void addClerk()
{
if(num >= 20)
{
try
{
wait(); //商品数量超过20就进入等待,即暂停生产;
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
else
{
try
{
Thread.sleep(10);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(“生产者生产后的数量:” + num);
num++;
notifyAll(); //将进入等待状态的cosumeClerk唤醒;
}

}
public synchronized void cosumeClerk()
{
if(num < 1)
{
try
{
wait();//商品数量为0时就进入等待状态;
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
else
{
System.out.println(“消费者消费后的数量:” + num);
num—;
notifyAll(); //将进入等待状态的addClerk唤醒;
}
}
}

//生产者;
class Producter implements Runnable
{
Clerk clerk;
public Producter(Clerk clerk)
{
this.clerk = clerk;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(100);
} catch (InterruptedException e)
{
e.printStackTrace();
}
clerk.addClerk();
}
}

}

//消费者;
class Customers implements Runnable
{
Clerk clerk;
public Customers(Clerk clerk)
{
this.clerk = clerk;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(50);
} catch (InterruptedException e)
{
e.printStackTrace();
}
clerk.cosumeClerk();
}
}
}

发表评论

表情:
评论列表 (有 0 条评论,287人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线通信Object的waitnotify

    wait/notify等待通知方式 等待通知机制就是将处于等待状态的线程将由其它线程发出通知后重新获取CPU资源,继续执行之前没有执行完的任务。最典型的例子生产者–消费者

    相关 线同步通信等)

    /\  \ 生产者将产品交给店员,二消费者从店员处取走产品;  \ 店员持有的产品数量不超过20,如果超过20叫生产者停一下,少于20就继续生产;  \ 如果

    相关 Java线同步机制:synchronized

    如果程序是单线程的,就不必担心此线程在执行时被其他线程“打扰”,就像在现实世界中,在一段时间内如果只能完成一件事情,不用担心做这件事情被其他事情打扰。但是,如果程序中同时使用多