java多线程得不到想要的结果

问题是:三个人频繁通过只允许一个人经过的门,当人们通过门时,统计人数
另外还会记录通行者的姓名和出生地,当姓名和出生地的头一个字母不相等时
输出这是第几人通过,姓名和出生地在哪

门:

public class Gate {
    private int count=0;
    private String Pname="Nobody";
    private String Paddress="Nowhere";

    public void pass(String Pname,String Paddress){
        this.count++;
        this.Pname=Pname;
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            // TODO: handle exception
        }
        this.Paddress=Paddress;
        if(Pname.charAt(0)!=Paddress.charAt(0)){
            System.out.println("*******broken********"+toString());}
    }

    public String toString(){
        return "No."+count+":"+Pname+","+Paddress;
    }
}

通过的人:

public class User extends Thread{
    private  final String name;
    private final String address;
    private final Gate gate;

    public User(Gate gate,String name,String address) {
        this.name=name;
        this.address=address;
        this.gate=gate;
    }

    public void run(){
        System.out.println(name+"   begin");
        while(true){
            gate.pass(name, address);
        }
    }
}

主函数:

public class Main {
public static void main(String[] args) {
    Gate gate=new Gate();
    new User(gate, "Alice", "Aust").start();
    new User(gate, "Bob", "Brazil").start();
    new User(gate, "Chris", "Canada").start();
}
}

按理说应该是很快就能得出经过的人姓名和出生地的头一个字母会不相等,但就是出不来,当把下面不等号改成等号反而会得出结果,不明白这是为什么

if(Pname.charAt(0)!=Paddress.charAt(0))

没有C币,大家见谅!!!在此小的谢谢您了!

3个回答

刚刚,我自己试了一下,光速打脸啊。
确实是没加this的问题,加了this才能确保取到的值是当前线程的值

qq_41235711
qq_41235711 是的,明白了,谢谢大神!!!
9 个月之前 回复

第一看你参数

public class Main {
public static void main(String[] args) {
    Gate gate=new Gate();
    new User(gate, "Alice", "Aust").start();
    new User(gate, "Bob", "Brazil").start();
    new User(gate, "Chris", "Canada").start();
}
}

第二看这个方法

private int count=0;
    private String Pname="Nobody";
    private String Paddress="Nowhere";

    public void pass(String Pname,String Paddress){
        this.count++;
        this.Pname=Pname;
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            // TODO: handle exception
        }
        this.Paddress=Paddress;
        if(Pname.charAt(0)!=Paddress.charAt(0)){
            System.out.println("*******broken********"+toString());}
    }

该说的都说了,望采纳

weixin_42160515
星期三_操纵 回复qq_41235711: 看这个图片
9 个月之前 回复
weixin_42160515
星期三_操纵 回复qq_41235711: https://graph.baidu.com/resource/1017069f967658a24d71c01556203431.jpg
9 个月之前 回复
weixin_42160515
星期三_操纵 回复qq_41235711: 你传递参数的那个方法
9 个月之前 回复
qq_41235711
qq_41235711 我就想在没加synchronize之前测试下多线程出来的结果是什么,应该是能很快得出if条件不满足的,但就是得不出来
9 个月之前 回复
qq_41235711
qq_41235711 什么意思?还是没明白,能不能详细说下
9 个月之前 回复
weixin_42160515
星期三_操纵 回复NR星期三: 还有这个方法也不太严谨,最好在pass方法上加个synchronized,个人建议
9 个月之前 回复
weixin_42160515
星期三_操纵 回复NR星期三: if(Pname.charAt(0)!=Paddress.charAt(0))这个根本不需要
9 个月之前 回复
weixin_42160515
星期三_操纵 故意的就不要弄出来了,还不如写一篇关于线程的的东西
9 个月之前 回复

new User(gate, "Alice", "Aust").start();
new User(gate, "Bob", "Brazil").start();
new User(gate, "Chris", "Canada").start();
这三个人不是第一个字母都相等吗? 不等当然没有结果 等于每次都会触发

if(Pname.charAt(0)!=Paddress.charAt(0)){
            System.out.println("*******broken********"+toString());}
    }

改为

if(this.Pname.charAt(0)!=this.Paddress.charAt(0)){
            System.out.println("*******broken********"+toString());}
    }
weixin_39606236
꧁gaoKuo꧂ 回复qq_41235711: 你忘记加this.了,回答已经更新了 看看把,眼都看瞎了..
9 个月之前 回复
weixin_39606236
꧁gaoKuo꧂ 回复qq_41235711: 明白你的意思了 你page是一个实例公用啊
9 个月之前 回复
weixin_39606236
꧁gaoKuo꧂ 回复qq_41235711: 交替运行不会导致信息错乱啊,就是一个执行顺序不同,不影响结果的
9 个月之前 回复
qq_41235711
qq_41235711 可这是在多线程的情况下啊,他们交替运行,就会出现不等的情况啊
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问