我在核心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.
问题是“我如何确保所有线程获得相同的机会。由于这是一个小程序,线程将完成其工作并在几毫秒内完成,我们将不会知道。如果一个线程需要很长时间才能运行“?
请帮忙。
答案 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();
}
}