gpt4 book ai didi

java - 具有共享整数对象的线程未按预期工作

转载 作者:太空宇宙 更新时间:2023-11-04 09:51:01 25 4
gpt4 key购买 nike

我遇到一个问题,我必须以这种格式打印数字。

First  1
First 2
Second 3
Second 4
First 5
First 6
Second 7
Second 8
First 9
and so on...

我已经实现了我的可运行界面,如下所示。

class ThreadDemo implements Runnable {

public volatile Integer num;

public Object lock;

public ThreadDemo(Integer num, Object lock) {
this.num = num;
this.lock = lock;
}

@Override
public void run() {

try {
while (true) {
int count = 0;
synchronized(lock) {
Thread.sleep(100);
while (count < 2) {
System.out.println(Thread.currentThread().getName() + " " + num++);
count++;

}
lock.notify();
lock.wait();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

我的主要类(class)如下

public class CoWorkingThreads {
private static volatile Integer num = new Integer(1);
public static void main(String...args) {
Object lock = new Object();
Thread thread1 = new Thread(new ThreadDemo(num, lock), "First");
thread1.start();
Thread thread2 = new Thread(new ThreadDemo(num, lock), "Second");
thread2.start();

}
}

当我运行程序时,我得到的输出如下

First  1
First 2
Second 1
Second 2
First 3
First 4
Second 3
Second 4

而不是之前预期的结果。但是当我将整数更改为原子整数类型时,我开始得到预期的结果。谁能解释一下我可以做些什么来让它使用整数而不是使用原子整数运行

最佳答案

Java 整数不能通过引用传递。在您的代码中,每个线程都会创建该变量的副本。但是,atomicInteger 可以通过引用传递。

此外,为了获得正确的结果,您可以将 num 变量更改为静态变量。

public static Integer num = 1;

public Object lock;
public ThreadDemo(Integer num, Object lock) {
//this.num = num;
this.lock =lock;
}

关于java - 具有共享整数对象的线程未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54753524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com