【Java】同步关键字就解决哲学家吃饭问题
来源:互联网 发布:在线支付源码 编辑:程序博客网 时间:2024/04/26 06:11
public class W05 {
public static void main(String[] args) {
// TODO Auto-generated method stub
kuaizi k1 = new kuaizi();
kuaizi k2 = new kuaizi();
kuaizi k3 = new kuaizi();
kuaizi k4 = new kuaizi();
zhexuejia z1 = new zhexuejia(k4, k1);
z1.setName("A");
zhexuejia z2 = new zhexuejia(k1, k2);
z2.setName("B");
zhexuejia z3 = new zhexuejia(k2, k3);
z3.setName("C");
zhexuejia z4 = new zhexuejia(k3, k4);
z4.setName("D");
z1.start();
z2.start();
z3.start();
z4.start();
}
}
class kuaizi{
boolean enable = true;
public void setTaken(boolean taken) {
this.enable = enable;
}
public synchronized void take() throws InterruptedException{
this.enable = false;
}
public synchronized void drop(){
this.enable = true;
this.notifyAll();
}
}
class zhexuejia extends Thread{
private kuaizi zuo;
private kuaizi you;
public zhexuejia(kuaizi zuo, kuaizi you) {
super();
this.zuo = zuo;
this.you = you;
}
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "正在思考");
if(zuo.enable){
zuo.take();
System.out.println(Thread.currentThread().getName() + "拿到了左筷子");
}else{
while(!zuo.enable){
System.out.println(Thread.currentThread().getName() + "正在等待左筷子");
//Thread.sleep(500);
}
}
//Thread.sleep(500);
if(you.enable){
you.take();
System.out.println(Thread.currentThread().getName() + "拿到了右筷子");
}else{
while(!you.enable){
System.out.println(Thread.currentThread().getName() + "正在等待右筷子");
//Thread.sleep(500);
}
}
System.out.println(Thread.currentThread().getName() + "正在吃饭");
zuo.drop();
you.drop();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
kuaizi k1 = new kuaizi();
kuaizi k2 = new kuaizi();
kuaizi k3 = new kuaizi();
kuaizi k4 = new kuaizi();
zhexuejia z1 = new zhexuejia(k4, k1);
z1.setName("A");
zhexuejia z2 = new zhexuejia(k1, k2);
z2.setName("B");
zhexuejia z3 = new zhexuejia(k2, k3);
z3.setName("C");
zhexuejia z4 = new zhexuejia(k3, k4);
z4.setName("D");
z1.start();
z2.start();
z3.start();
z4.start();
}
}
class kuaizi{
boolean enable = true;
public void setTaken(boolean taken) {
this.enable = enable;
}
public synchronized void take() throws InterruptedException{
this.enable = false;
}
public synchronized void drop(){
this.enable = true;
this.notifyAll();
}
}
class zhexuejia extends Thread{
private kuaizi zuo;
private kuaizi you;
public zhexuejia(kuaizi zuo, kuaizi you) {
super();
this.zuo = zuo;
this.you = you;
}
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "正在思考");
if(zuo.enable){
zuo.take();
System.out.println(Thread.currentThread().getName() + "拿到了左筷子");
}else{
while(!zuo.enable){
System.out.println(Thread.currentThread().getName() + "正在等待左筷子");
//Thread.sleep(500);
}
}
//Thread.sleep(500);
if(you.enable){
you.take();
System.out.println(Thread.currentThread().getName() + "拿到了右筷子");
}else{
while(!you.enable){
System.out.println(Thread.currentThread().getName() + "正在等待右筷子");
//Thread.sleep(500);
}
}
System.out.println(Thread.currentThread().getName() + "正在吃饭");
zuo.drop();
you.drop();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
0 0
- 【Java】同步关键字就解决哲学家吃饭问题
- java多线程哲学家思考吃饭问题
- 哲学家吃饭问题
- 死锁—哲学家吃饭问题
- 哲学家吃饭
- 并发多线程之死锁-----哲学家吃饭问题
- 尝试解决哲学家进餐问题(Java实现)
- 哲学家就餐问题Java版解决案
- java实现哲学家进餐问题,及其死锁问题的解决
- 5位哲学家吃饭问题(算法描述)
- 黑马程序员技术博客之哲学家吃饭问题
- 哲学家吃饭问题 代码实现如何 避免线程死锁
- 哲学家吃饭问题(资源加锁和超时释放)
- 移动端多线程编程高级篇-哲学家吃饭问题
- [Java]哲学家就餐问题
- Chandy/Misra解法 解决哲学家就餐问题 java实现
- Eilxir解决哲学家就餐问题
- 利用synchronized解决哲学家问题
- c# http get post 用法
- WCF入门教程五[WCF的通信模式]
- ACM到底该不该坚持??
- Java集合框架图
- linux运维之文件系统
- 【Java】同步关键字就解决哲学家吃饭问题
- spring+mybatis 根据业务场景访问不同数据库,读写分离
- 在 Activity 之间传递(Bundle)参数
- 用cxf开发webservice 完整例子
- zzuli OJ 1077: 字符串加密
- 开关控件UISwitch
- libgdx API之AI:AI让游戏对象思考
- HDOJ 题目4691 Front compression(后缀数组+RMQ最长前缀)
- syncfusion mvc 需要引用的包