gpt4 book ai didi

java - 使用线程增加静态变量

转载 作者:行者123 更新时间:2023-12-01 09:26:11 26 4
gpt4 key购买 nike

我有很多客户,每个客户都有自己的线程。我有一个咖啡馆对象,其中包含最多 5 个许可证的信号量。客户到达和离开的时间不同,因此我需要跟踪耗时,客户在到达时从信号量获得许可,在离开时释放信号量。

客户实现了 runnable,它在下面调用了咖啡馆的“eat”方法。我已经测试过,我的计数器正在增加到超过到达时间,但 try/catch 语句没有被调用。

public void eat(Customer customer)
{

while(true) {

System.out.println("hello");

if (customer.getArrivalTime() < Main.counter) {

try {

semaphore.acquire();
System.out.println(customer.getName() + ' ' + customer.getArrivalTime());
TimeUnit.SECONDS.sleep(customer.getLeavetime());
} catch (InterruptedException iex) {
iex.printStackTrace();
} finally {
//System.out.printf("Farmer %s has crossed the bridge.\n",customer.getName());
semaphore.release();
System.out.println(Main.counter);
break;
}
}
}
}

客户类别的相关片段

public class Customer implements Runnable{

public void run() {
icecream.eat(this);

}

主要相关片段

 public class Main {

static int counter = 0;
static Timer timer;

public static void main(String[] args) {

//create timer task to increment counter
TimerTask timerTask = new TimerTask() {

@Override
public void run() {
// System.out.println("TimerTask executing counter is: " + counter);
counter++;
}
};

Customer c1 = new Customer(Parlor, 5); //arrival time of 5
Thread t1 = new Thread(c1);
timer = new Timer("MyTimer");//create a new timer
timer.scheduleAtFixedRate(timerTask, 1000, 1000); //start timer to increment counter
t1.start();

如有任何帮助,我们将不胜感激

最佳答案

counter 变量的更改并非对所有线程可见。为了确保所有线程读取相同的counter值,您必须使用 volatile

static volatile int counter = 0;

更多信息请参阅Atomic Accessstatic vs. volatile .

关于java - 使用线程增加静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39814098/

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