综合案例分析

利用生产者和消费者模式,模拟做馒头和吃馒头的过程

要求:有3个生产者,2个消费者,完成50个馒头的制作和消费的过程

package demo1;

/**
 * 馒头类
 */
public class SteamedBuns {
    //没有馒头
    private boolean Instock=false;
    //被制作的馒头总数量
    private int Mnum=0;
    //被吃的馒头总数量
    private int Enum=0;
    //馒头剩余数量
    private int surplus=0;


    public SteamedBuns(){}

    public SteamedBuns(boolean instock) {
        this.Instock = instock;
    }

    public boolean isInstock() {
        return this.Instock;
    }

    public void setInstock(boolean instock) {
        this.Instock = instock;
    }

    public int getMnum() {
        return Mnum;
    }

    public void setMnum(int mnum) {
        Mnum = mnum;
    }

    public int getEnum() {
        return Enum;
    }

    public void setEnum(int anEnum) {
        Enum = anEnum;
    }

    public int getSurplus() {
        return surplus;
    }

    public void setSurplus(int surplus) {
        this.surplus = surplus;
    }
    public void addSurplus() {
        this.surplus=this.surplus+1;
    }
    public void redSurplus() {
        this.surplus=this.surplus-1;
    }
}

package demo1;

/**
 * 消费者类
 */
public class Consumer extends Thread{
    private String name;
    //馒头对象
    private SteamedBuns steamedBuns;
    //吃的馒头的数量
    private int num=0;
    public Consumer(String name,SteamedBuns steamedBuns) {
        this.steamedBuns = steamedBuns;
        this.name=name;
    }
    @Override
    public void run() {
        while (steamedBuns.getEnum()<50){
            synchronized (steamedBuns) {
                if (steamedBuns.getSurplus() == 0) {
                    //没有剩余馒头时
                    try {
                        System.out.println(this.name + ": 没馒头了,快做!");
                        steamedBuns.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    if (steamedBuns.getEnum() < 50) {
                        System.out.println("[" + this.name + "]:正在吃馒头...");
                        steamedBuns.redSurplus();
                        steamedBuns.setEnum(steamedBuns.getEnum() + 1);
                        num++;
                        System.out.println(name + "已经吃了" + num + "个馒头");
                        System.out.println("全部顾客总共已经吃了" + steamedBuns.getEnum() + "个馒头");
                        steamedBuns.notifyAll();
                    } else {
                        //吃了50个馒头,不在唤醒进程了
                        System.out.println("总共已经吃了50个馒头了,不再吃了!");
                    }

                }
            }
        }
    }


}

package demo1;

/**
 * 生产者类
 */
public class Producer extends Thread{
    private String name;
    //馒头对象
    private SteamedBuns steamedBuns;

    public Producer(String name,SteamedBuns steamedBuns) {
        this.steamedBuns = steamedBuns;
        this.name=name;
    }

    @Override
    public void run() {
        while (steamedBuns.getMnum()<50){
            synchronized (steamedBuns){
                //判断馒头是否还有
                if(steamedBuns.getSurplus()>0){

                    try {
                        //如果还有馒头
                        System.out.println("还有"+steamedBuns.getSurplus()+"个馒头");
                        steamedBuns.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }

                if(steamedBuns.getMnum()<50) {
//                    steamedBuns.setInstock(true);
                    steamedBuns.addSurplus();
                    steamedBuns.setMnum(steamedBuns.getMnum() + 1);
                    System.out.println("【"+name + "】:做出第" + steamedBuns.getMnum() + "个馒头");
                    System.out.println("总共已经做了" + steamedBuns.getMnum() + "个馒头");
                    steamedBuns.notifyAll();
                }else {
                    //做了50个馒头,不在唤醒进程了
                    System.out.println("总共已经做了50个馒头,不再做了!");
                }

            }
        }
    }
}

package demo1;

/**
 * 利用生产者和消费者模式,模拟做馒头和吃馒头的过程
 * 要求:有3个生产者,2个消费者,完成50个馒头的制作和消费的过程
 *
 * 测试
 */
public class Test {
    public static void main(String[] args) {
        SteamedBuns steamedBuns=new SteamedBuns();
        Thread producer1=new Producer("一号生产线",steamedBuns);
        Thread producer2=new Producer("二号生产线",steamedBuns);
        Thread producer3=new Producer("三号生产线",steamedBuns);
        Thread consumer1=new Consumer("一号顾客",steamedBuns);
        Thread consumer2=new Consumer("二号顾客",steamedBuns);
        producer1.start();
        producer2.start();
        producer3.start();
        consumer1.start();
        consumer2.start();
    }
}

多线程客户端下载文件

package demo2;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务器端类
 */
public class Server {

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(6666);
        System.out.println("服务器启动...");
        while (true) {
            Socket socket = server.accept();
            // 使用多线程
            // 每有一个客户端连接服务器,就开启一个线程,进行文件的传输
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(socket.getInetAddress().getHostAddress()+Thread.currentThread().getName()+"接入服务器");
                    try {
                        // 读取的文件数据源
                        FileInputStream fis = new FileInputStream("wallhaven-9mo66w.jpg");
                        OutputStream os = socket.getOutputStream();
//                        InputStream is=socket.getInputStream();
//                        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//                        System.out.println(bufferedReader.readLine());
//                        bufferedReader.close();
                        int len = 0;
                        byte[] bytes = new byte[1024];
                        while ((len = fis.read(bytes)) != -1) {
                            os.write(bytes, 0, len);
                        }
                        //读取"上传成功"的字节读取流
//                        int num=is.read(bytes);
//                        System.out.println(new String(bytes,0,num));

                    } catch (Exception e) {
                        e.printStackTrace();
                    }finally {
                        try {
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
            // 服务端一直开着不关
            // serverSocket.close();
        }
    }
}

package demo2;

import java.io.*;
import java.net.Socket;

/**
 * 客户端类
 */
public class Client extends Thread {
    private String name;

    public Client(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        try {
            System.out.println(this.name+Thread.currentThread().getName()+"客户端启动...");
            Socket socket = new Socket("127.0.0.1", 6666);
            InputStream is = socket.getInputStream();
//            OutputStream os=socket.getOutputStream();
            File file = new File("src\\download");
            if (!file.exists()) {
                file.mkdirs();
            }
//            BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//            bufferedWriter.write(this.name+"请求下载");

            FileOutputStream fos = new FileOutputStream(file + "\\" + this.name + Thread.currentThread().getName() + System.currentTimeMillis() + "1.jpeg");
            //接受数据,写在本地
            int len = 0;
            byte[] bytes = new byte[1024];
            while ((len = is.read(bytes)) != -1) {
                fos.write(bytes, 0, len);
            }
            System.out.println(this.name + Thread.currentThread().getName() + "下载成功!");
//            os.write((this.name+"申请下载").getBytes());
            // 5. 关流
            fos.close();
            is.close();
//            os.close();
            socket.close();
//            bufferedWriter.flush();
//            bufferedWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

package demo2;

public class Test {
    public static void main(String[] args) {
        //创建四个客户端下载进程
        Thread t1=new Client("下载1");
        Thread t2=new Client("下载2");
        Thread t3=new Client("下载3");
        Thread t4=new Client("下载4");
        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值