利用生产者和消费者模式,模拟做馒头和吃馒头的过程
要求:有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();
}
}