-1

在弄清楚我不能自动装箱自己的类型之后,我仍然需要一个在分配时自动调整自身的值。这会起作用吗,还是会简单地冻结?如果它不会,那么帮助将不胜感激。

while(true){
    if(x){
        y=z
    }
}

注意:如果我更好地解释我的课程可能会有所帮助,所以这里是:它本质上与整数相同,但它需要一个最大值和一个最小值。我需要这样当它的值大于最大值时,它从最小值开始,反之亦然。例子:

LoopInteger i = new LoopInteger(0, 3, 0); //min, max, value
i.setValue(5); //When this is run, i need it to set the value to 1, as it is two more than the max of 3
i.setValue(-2); //The same here, except now it has to be set to 2, as it is two less than the min of 0.

基本上,它至少具有可配置的最大值并且未签名。

4

2 回答 2

1

好吧,只要它是这样写的,你就可以做类似的工作(有点):

volatile boolean x;
...
while (true) {
   if (x) {
       y = z;
       break;
   }
}

(请注意,您需要声明x为 volatile 或synchronized为此线程使用同步以可靠地看到x另一个线程所做的更新。)

但是,这是一种不好的实现方式。本质上,一个线程将不断执行该循环,直到x设置为true. 这将占用您的一个核心,占用您系统的大量内存带宽……并耗尽您机器的电池。

更好的方法是设置x私有,并编写它的设置器以在变量更新时通知另一个线程。

或者更好的是,使用事件/事件侦听器或类之一来实现您尝试做的任何事情java.util.concurrent。(很难建议哪个最好,因为你的例子太做作了......)

于 2012-11-17T07:00:47.773 回答
0

我没有看到您的循环的任何终止条件,因此它将继续循环。我认为您可以执行以下两种操作之一:

  1. 使用break

     while(true){
       if(x){
          y=z;
          break;
       }
    }
    
  2. 使用状态标志:

     boolean found = false;
     while(!found){
       if(x){
          y=z;
          found = true;
       }
    }
    

另外我建议在循环中设置一些时间间隔,例如 100 毫秒(Thread.sleep(100));否则它将不断循环单元x条件满足。

于 2012-11-17T06:32:42.390 回答