2 greetings2016 Greetings2016 于 2016.02.28 20:49 提问

初学java多线程 遇到点问题望各位前辈不吝赐教

/*张三先洗漱,然后让李四洗漱 李四洗刷完让张三上厕所 张三上完厕所 让李四上厕所
**/
static MyRoomThread zhangsan = new MyRoomThread("张三");
static MyRoomThread lisi = new MyRoomThread("李四");

String name ;
Object toliet = new Object();

MyRoomThread(String name) {
this.name = name;
}

@Override
public void run() {
try {
synchronized (toliet) {
if (this.name.equals("张三")) {
this.Brush();
toliet.wait();
this.release();
toliet.notify();

}else {
this.Brush();
toliet.wait();;
toliet.notify();
this.release();

}
}
}catch (Exception e) {
e.printStackTrace();
}

}
//洗漱的方法
public void Brush() throws Exception {
System.out.println(this.name+"上厕所,刷牙ing。。。");
Thread.sleep(2000);
System.out.println(this.name+"刷牙完毕,离开厕所。。。");
}
//上厕所的方法
public void release() throws Exception {
System.out.println(this.name+"在上厕所,正在小便ing。。。");
Thread.sleep(2000);
System.out.println(this.name+"小便完毕,离开厕所");
}
}
public >
public static void main(String[] args) {
MyRoomThread.zhangsan.start();
MyRoomThread.lisi.start();

}

}

3个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.29 06:39
已采纳

你的代码有问题,你的每个线程对象都有一个Object toliet = new Object();加锁都是在自己成员属性上,锁不同,当然不能有互斥访问了。就好比每个人都在自己家,用的都是自己家的toilet,当然会出现4个人同时都在自己家的toilet的现象啊。你要把这个toilet变成火车上公共的。
你应该保证所有线程运行run时对共享变量的访问用的是同一个锁对象,然能实现互斥效果。

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.29 06:51

给你个正确互斥访问的版本,你试试:

 public class MyRoomThread extends Thread {
    String name;
    Object toliet;

    MyRoomThread(String name,Object toilet) {
        this.name = name;
        this.toliet = toilet;
    }

    @Override
    public void run() {
        try {
            synchronized (toliet) {
                if (this.name.equals("张三")) {
                    this.Brush();
                    toliet.wait();
                    this.release();
                    toliet.notify();

                } else {
                    this.Brush();
                    toliet.wait();
                    ;
                    toliet.notify();
                    this.release();

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    // 洗漱的方法
    public void Brush() throws Exception {
        System.out.println(this.name + "上厕所,刷牙ing。。。");
        Thread.sleep(2000);
        System.out.println(this.name + "刷牙完毕,离开厕所。。。");
    }

    // 上厕所的方法
    public void release() throws Exception {
        System.out.println(this.name + "在上厕所,正在小便ing。。。");
        Thread.sleep(2000);
        System.out.println(this.name + "小便完毕,离开厕所");
    }

    public static void main(String[] args) {
         Object publicToilet = new Object();
         MyRoomThread zhangsan = new MyRoomThread("张三",publicToilet);
         MyRoomThread lisi = new MyRoomThread("李四",publicToilet);
         zhangsan.start();
         lisi.start();
    }
}

运行结果,有互斥等待现象:

张三上厕所,刷牙ing。。。
张三刷牙完毕,离开厕所。。。
李四上厕所,刷牙ing。。。
李四刷牙完毕,离开厕所。。。
Greetings2016
Greetings2016 你好 十分感谢你的纠正 但是你写的程序无法运行上厕所小便的方法了 我不知道哪里出了问题
2 年多之前 回复
Greetings2016
Greetings2016 上厕所的那个方法总是显示不出来 是不是死锁了呢?
2 年多之前 回复
Mr_dsw
Mr_dsw   Ds   Rxr 2016.02.28 23:07

遇到的是线程不同步吧?刚学这块都这样

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
怎么将JAVA与数据库连接起来?新手上路,希望各位前辈多多指教!
 import java.sql.Connection; import java.sql.*; public class lianjie{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); String ur1="jdbc:sqlserver://localhost:1433;databaseName=zj
为什么使用消息队列?(消息队列的使用场景是怎样的?)
https://www.zhihu.com/question/34243607/answer/140732170消息队列的使用场景是怎样的? - ScienJus的回答 - 知乎https://www.zhihu.com/question/34243607/answer/58314162https://www.zhihu.com/question/34243607/answer/58314162...
【Hibernate框架开发之一】搭建Hibernate环境并成功运行第一个项目HelloHibernate并解决3个常出现的运行问题;
主页 > SSH之Hibernate框架 > 【Hibernate框架开发之一】搭建Hibernate环境并成功运行第一个项目HelloHibernate并解决3个常出现的运行问题; 【Hibernate框架开发之一】搭建Hibernate环境并成功运行第一个项目HelloHibernate并解决3个常出现的运行问题; 本站文章均为 李华明Himi 原创,转载务必在
自制的J2ME横版过关游戏
小弟学习的毕业小作品,瑕疵不少,但还是可以玩玩的,望各位大虾不吝赐教
香农(shannon)编码c++程序
这是用VC++编写的程序,请到VC上运行。望各位不吝赐教。
算法递归与分治
算法设计与分析过程中的学习代码加解析,免费提供给各位,如有错误望不吝赐教。
霍夫曼(huffman)编码C++程序
这是用VC++编写的程序,请到VC上运行。望各位不吝赐教。
算法设计与分析贪心
算法设计与分析过程中的学习代码加解析,免费提供给各位,如有错误望不吝赐教。
算法动态规划
算法设计与分析过程中的学习代码加解析,免费提供给各位,如有错误望不吝赐教。
算法设计与分析回溯
算法设计与分析过程中的学习代码加解析,免费提供给各位,如有错误望不吝赐教