欢迎进入JAVA基础课程
博客地址:https://blog.csdn.net/houjiyu...
本系列文章将主要针对JAVA一些基础知识点进行讲解,为平时归纳所总结,不管是刚接触JAVA开发菜鸟还是业界资深人士,都希望对广大同行带来一些帮助。若有问题请及时留言或加QQ:243042162。
寄语:
你失落过吗?你紧张过吗?你憧憬过吗?无论生活琐事中还是繁忙的工作中,我想大部分人会遇到类似的情况,无形中压力、失落、失望像座大山一样顶在自己的胸口闯不过起来。于是,你开始憧憬,开始幻想,要我是换个方式结局可能就不一样了。殊不知,人生没有如果!调整好心态,未雨绸缪,天道酬勤!
生产者消费者问题
1. 背景
有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,进餐完毕,放下筷子又继续思考。
2. 代码实现
//定义哲学家类,每个哲学家相当于一个线程
class Philosopher extends Thread{
private String name;
private Fork fork;
public Philosopher(String name,Fork fork){
super(name);
this.name=name;
this.fork=fork;
}
public void run(){//每个哲学家的动作,思考-》拿起筷子-》吃-》放下筷子
while (true){
thinking();
fork.takeFork();
eating();
fork.putFork();
}
}
//模拟思考
public void thinking(){
System.out.println("我在思考:"+name);
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//模拟吃放
public void eating(){
System.out.println("我在吃:"+name);
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Fork{
//5双筷子,初始未未使用
private boolean[] used={false,false,false,false,false};
//拿起筷子
public synchronized void takeFork(){
String name=Thread.currentThread().getName();
int i=Integer.parseInt(name);
while (used[i]||used[(i+1)%5]){//左右手有一只被使用则等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
used[i]=true;
used[(i+1)%5]=true;
}
//释放筷子
public synchronized void putFork(){
String name=Thread.currentThread().getName();
int i=Integer.parseInt(name);
used[i]=false;
used[(i+1)%5]=false;
notifyAll();
}
}
public class PhilosopherMain {
public static void main(String[] args) {
Fork fork=new Fork();
new Philosopher("0",fork).start();
new Philosopher("1",fork).start();
new Philosopher("2",fork).start();
new Philosopher("3",fork).start();
new Philosopher("4",fork).start();
}
}
输出结果
我在思考:0
我在思考:1
我在思考:2
我在思考:3
我在思考:4
我在吃:0
我在吃:2
我在思考:0
我在吃:4
我在思考:2
我在吃:1
我在思考:4
我在吃:3
我在思考:1
我在吃:0
我在思考:3
我在吃:2
我在思考:0
我在吃:4
我在思考:2
我在吃:1
我在思考:4
我在吃:3
我在思考:1
我在吃:0
我在思考:3
我在吃:2
我在思考:0
我在吃:4
我在思考:2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。