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

餐桌上的多线程问题

生产者和消费者模型

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

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


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-22 18:43:42

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

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

餐桌上的多线程问题 生产者和消费者模型 设想有一天你和一群朋友去餐馆吃饭,这是个典型的同步例子,你和你的朋友们共享着餐桌这个资源.想象一下,当你举起筷子准备夹菜的时候,却发现菜碟子被人端走了~这正是同步要解决的问题,必须保证在某人夹菜的时候,其他人不能把菜盘子端走.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.线程通