好的,我有一个运行一些代码的客户线程。但是我希望它在完成将计数器减少到零的特定方法(setShopTime和setCheckoutTime)后进入休眠状态。在计数器的每个递减时间点,我希望客户停止,直到每个其他线程也将他们的滴答减少1.但是,尽管不是所有客户都想要使用与两个相同的方法。在运行该方法之后,最好的方法是让每个线程都睡眠,还有另一个线程作为一个滴答计数器,然后在每次滴答之后中断其他线程以使它们再次移动?我只是担心这个问题,因为如果一个客户仍在运行并且滴答计数器线程中断,那么它可能会让事情变得更糟吗?
我会向您展示可运行的,也许比我更聪明的人可以给我一些关于如何最好地接近这个的提示?我已经发表评论,希望每次睡觉。
class customerRunnable implements Runnable {
private Customer customer;
private CheckoutFloor checkoutFloor;
private Lock customerLock;
private Condition customerReady;
public customerRunnable(CheckoutFloor checkoutFloor) {
customer = new Customer();
this.checkoutFloor = checkoutFloor;
}
public void run() {
customer.addRandomShopTime();
while (customer.shopTime > 0) {
customer.setShopTime();
//sleep
}
CheckoutOperator checkoutOperator = checkoutFloor.weightedCheckoutDeterminator();
checkoutOperator.addCustomer(customer);
while (customer.checkoutTime > 0) {
if (checkoutOperator.customerList.get(0) == customer) {
customer.setCheckoutTime();
//sleep
}
}
checkoutOperator.removeCurrentCustomer();
} catch (InterruptedException e) {
}
}
答案 0 :(得分:0)
也许修改后的版本符合您的需求:
public class Example
{
int counter1 = 10;
int counter2 = 10;
public class Thread1 extends Thread
{
@Override
public void run ()
{
try
{
while (Example.this.counter2 > 0)
{
// Do your stuff
synchronized (Example.this)
{
Example.this.counter1--;
Example.this.notifyAll();
Example.this.wait ();
}
}
}
catch (final InterruptedException e)
{
}
}
}
public class Thread2 extends Thread
{
@Override
public void run ()
{
try
{
while (Example.this.counter1 > 0)
{
// Do your stuff
synchronized (Example.this)
{
Example.this.counter2--;
Example.this.notifyAll();
Example.this.wait ();
}
}
}
catch (final InterruptedException e)
{
}
}
}
}
答案 1 :(得分:0)
永远不要使用sleep来修改线程的行为。 JVM决定线程何时运行,你会发现自己只是添加更长和更长的睡眠时间,直到线程顺序运行而不是并发运行。即使它似乎偶尔工作一次,它也不会是确定性的。
在您的代码中,当您应该阻止外部事件时,您正在使用while循环消耗CPU时间。看一下使用信号量减少你的滴答计数器并在线程之间共享。
答案 2 :(得分:0)
如果我理解正确,你想要使用屏障。以下是CyclicBarrier的文档,其中包含一些示例:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html