黑马程序员——餐桌上的多线程问题

餐桌上的多线程问题

生产者和消费者模型

设想有一天你和一群朋友去餐馆吃饭,这是个典型的同步例子,你和你的朋友们共享着餐桌这个资源。想象一下,当你举起筷子准备夹菜的时候,却发现菜碟子被人端走了~这正是同步要解决的问题,必须保证在某人夹菜的时候,其他人不能把菜盘子端走。Java中使用加锁的机制,使用Synchronized来保证代码执行的时候不受共享资源的其他人的干扰。

而餐厅的服务员根据你的订单给你上菜,当菜吃完了通知服务员给你们上菜,这又是个典型的生产者消费者模型。下面用内部类简单实现下这个问题。

package moreCoding1;

class Person {

String name;

Person ( String name){

this. name= name;

}

}

class Shop{

private Person

p1= new Person( "服务员" ),

p2= new Person( "张三" ),

p3= new Person( "李四" );

private boolean flag= false;

Thread thread1= new Thread( new Runnable(){

public void run () {

while (true ){

while (flag == true){

try {

wait ();

catch (Exception e ) {

}

}

synchronized ( this ) {

System . out. println( p1. name+ "上了" +">>>" +1 +"个菜" );

flag= true;

notifyAll ();

} }}}) ;

Thread thread2= new Thread( new Runnable(){

public void run () {

while (true ){

while (flag == false){

try {

wait ();

catch (Exception e ) {

}

}

synchronized ( this ) {

System . out. println( p2. name+ "吃了" +"<<<<" +1 +"个菜" );

flag= false;

notifyAll ();

} }}}) ;

Thread thread3= new Thread( new Runnable(){

public void run () {

// TODO Auto-generated method
stub

while (true ){

while (flag == false){

try {

wait ();

catch (Exception e ) {

}}

synchronized ( this ) {

System . out. println( p3. name+ "吃了" +"~~~~" +1 +"个菜" );

flag= false;

notifyAll ();

} }}}) ;

Shop (){

thread1. start ();

thread2. start ();

thread3. start ();

}

}

public class MyThread {

public static void main ( String[] args ) {

new Shop() ;

}

}

//

/*张三吃了<<<<1个菜

服务员上了>>>1个菜

张三吃了<<<<1个菜

服务员上了>>>1个菜

李四吃了~~~~1个菜

服务员上了>>>1个菜

李四吃了~~~~1个菜

服务员上了>>>1个菜

李四吃了~~~~1个菜*/

死锁

假如发生了这样的问题,筷子不够,筷子的跟数只有你们人数那么多,那么每个人吃饭都要先拿左手的筷子,然后再设法拿到右边的筷子,当你发现每个人左手都拿着筷子等右边的筷子的时候,死锁就产生了。

时间: 2024-10-13 03:16:45

黑马程序员——餐桌上的多线程问题的相关文章

黑马程序员——餐桌上的多线程

餐桌上的多线程问题 生产者和消费者模型 设想有一天你和一群朋友去餐馆吃饭,这是个典型的同步例子,你和你的朋友们共享着餐桌这个资源.想象一下,当你举起筷子准备夹菜的时候,却发现菜碟子被人端走了~这正是同步要解决的问题,必须保证在某人夹菜的时候,其他人不能把菜盘子端走.Java中使用加锁的机制,使用Synchronized来保证代码执行的时候不受共享资源的其他人的干扰. 而餐厅的服务员根据你的订单给你上菜,当菜吃完了通知服务员给你们上菜,这又是个典型的生产者消费者模型.下面用内部类简单实现下这个问题

黑马程序员-学习日记(多线程的初步认识)

 ------Java EE培训.Android培训.iOS培训.期待与您交流! ------- 进程:正在执行的应用程序.一个应用程序运行时内存分配的空间.线程:进程中一个程序执行的控制单元,一条执行路径.负责程序的执行顺序.多线程:在java虚拟机启动的时候会有一个java.exe的执行程序,即一个进程.该进程中至少有一个线程负责java程序的运行.而且这个线程运行的代码存在于main方法中. class Demo extends Thread { public void run() { f

黑马程序员-学习日记(多线程)

进程:正在执行的应用程序.一个应用程序运行时内存分配的空间.线程:进程中一个程序执行的控制单元,一条执行路径.负责程序的执行顺序. 多线程存在的意义: 程序运行中至少有两个线程在运行,一个是主函数的主线程,另一个是垃圾回收的线程. 线程创建方式一: 继承Thread类.要覆盖其run方法,调用线程的start方法. 作用:1.启动线程 2.运行run方法.目的是将自定义的代码存储在run方法中,让线程运行 cpu每次只执行一个程序,只是在快速的不同线程间切换,表现了多线程的随机性 class M

黑马程序员-学习日记(多线程安全问题和死锁认识)

------Java培训.Android培训.iOS培训.期待与您交流! ------- 安全问题产生的原因: 当多条代码语句在操作同一个共享数据时,一个线程对多条语句只执行了一部分,还没有执行完, 另一个线程参与进来执行.导致共享数据的错误. class Mlpc implements Runnable { private int ticket = 50; public void run() { while(true) { if(ticket>0) { try { Thread.sleep(2

黑马程序员-Java基础之多线程

多线程 进程:正在进行中的程序.其实进程就是一个应用程序运行时的内存分配空间. 线程:其实就是进程中一个程序执行控制单元,一条执行路径.进程负责的是应用程序的空间的标示.线程负责的是应用程序的执行顺序. 一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区.自己的变量. jvm在启动的时,首先有一个主线程,负责程序的执行,调用的是main函数.主线程执行的代码都在main方法中. 当产生垃圾时,收垃圾的动作,

黑马程序员---java基础-Java 多线程

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 进程指的是一个正在执行中的程序,而线程则是进程中一个负责程序执行的控制单元.一个进程中可以有多个执行路径,这就是多线程.开启多个线程可以运行多部分代码,这样就能运行多个功能 一.多线程的创建 在java中,创建多线程主要有以下两个方式: 1.继承Thread类: 1 public class test { 2 3 public static void main(String[] args) {

黑马程序员_Java基础:多线程总结

------- android培训.java培训.期待与您交流! ---------- 一.多线程的概念 进程和线程经常会被人混淆,那是因为对它们的概念不明确.就拿我们平时使用的操作系统来说,它是多任务的操作系统,而多线程就是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程.  线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如平时下载的软件迅雷进程中可以

黑马程序员_日记17_Java多线程(七)

--- android培训.java培训.期待与您交流! ---- 线程间通信 线程间的通信: 其实就是多个线程操作同一个资源,但是操作的动作不同. 一.我的示例 这是我写的关于线程间通信的示例. 本示例需要定义三个类: 1 资源类Resource 2 输入类Input 3 输出类Output 步骤: 1 先写出基本代码 2 找安全问题并修改 1 初级代码 //本类定义的资源是,人的数据 class Resource { private String name;//私有化人的名字 private

黑马程序员系列第二篇 多线程(2)

ASP.Net+Android+IOS开发  .Net培训.期待与您交流! (前言:本篇文章主要依据毕向东老师的课程视频整理而成,如要详细学习,请观看毕老师视频  百度网盘链接地址:http://pan.baidu.com/s/1sjQRHDz) 目录:1.线程通信--生产消费者示例(线程通信安全.等待唤醒机制)    2.停止线程.及其会出现的问题.及解决的办法    3.守护线程及几个Thread的方法                   4.工作中线程的常见写法         1.线程通