多线程 - 如何让所有线程同时打勾

时间:2014-05-31 01:47:44

标签: java multithreading

好的,我有一个运行一些代码的客户线程。但是我希望它在完成将计数器减少到零的特定方法(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) {

    }
}

3 个答案:

答案 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