如何使长等待线程运行

时间:2018-05-04 12:51:11

标签: java multithreading concurrency synchronized reentrantlock

我在核心java工作。我有一个小程序,它将通过相应的线程thread1,thread2和thread3打印数字1,2,3。

while(true)
        {
            synchronized (obj)
            {

                System.out.println("Thread got chance : "+Thread.currentThread().getName());


                if (ai.get() ==0 && Thread.currentThread().getName().equalsIgnoreCase("Thread1"))
                {
                    System.out.print(ai.incrementAndGet()+"("+Thread.currentThread().getName()+")"+" ");
                    obj.notify();
                    obj.wait();
                }

                if (ai.get() ==1 && Thread.currentThread().getName().equalsIgnoreCase("Thread2"))
                {
                    System.out.print(ai.incrementAndGet()+"("+Thread.currentThread().getName()+")"+" ");
                    obj.notify();
                    obj.wait();
                }

                if (ai.get() ==2 && Thread.currentThread().getName().equalsIgnoreCase("Thread3"))
                {
                    System.out.print(ai.incrementAndGet()+"("+Thread.currentThread().getName()+")"+" ");
                    System.out.println("");
                    ai.set(0);
                    obj.notify();
                    obj.wait();
                }

            }

        }

在上面的程序逻辑中很好并且正常工作,即按顺序打印。但是我用“Thread got change”打印了线程名称。即我试图确定哪个线程有更多机会运行并且知道线程名称Ex thread 2.

问题是“我如何确保所有线程获得相同的机会。由于这是一个小程序,线程将完成其工作并在几毫秒内完成,我们将不会知道。如果一个线程需要很长时间才能运行“?

请帮忙。

1 个答案:

答案 0 :(得分:0)

synchronized不支持fair政策。 当您致电notify()时,可以唤醒任何等待线程。

您可以使用公平ReentrantLock

  • 当您致电lock()时,等待时间最长的线程将获得锁定。
  • 当您致电signal()时,将首先发出最长等待线程的信号。

这是示例代码:

// Use the same lock and condition in different threads
ReentrantLock lock = new ReentrantLock(true);  // create a fair lock
Condition condition = lock.newCondition();

while (true) {
    lock.lock();
    try {
        System.out.println("Thread got chance : " + Thread.currentThread().getName());

        if (ai.get() == 0 && Thread.currentThread().getName().equalsIgnoreCase("Thread1")) {
            System.out.print(ai.incrementAndGet() + "(" + Thread.currentThread().getName() + ")" + " ");
            condition.signal();
            condition.await();
        }

        if (ai.get() == 1 && Thread.currentThread().getName().equalsIgnoreCase("Thread2")) {
            System.out.print(ai.incrementAndGet() + "(" + Thread.currentThread().getName() + ")" + " ");
            condition.signal();
            condition.await();
        }

        if (ai.get() == 2 && Thread.currentThread().getName().equalsIgnoreCase("Thread3")) {
            System.out.print(ai.incrementAndGet() + "(" + Thread.currentThread().getName() + ")" + " ");
            System.out.println("");
            ai.set(0);
            condition.signal();
            condition.await();
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}