Java 读者-作者问题-读者和作者的公平问题
我的任务是用java编写一个Readers-Writer程序,在本例中,它对java中的读者和作者都是公平的。在前两次运行中,程序运行正常,但当我运行了30个读卡器和3个写卡器时,程序停止运行。我不知道是什么原因。。。我创建了两个Java 读者-作者问题-读者和作者的公平问题,java,multithreading,concurrency,conditional-statements,locking,Java,Multithreading,Concurrency,Conditional Statements,Locking,我的任务是用java编写一个Readers-Writer程序,在本例中,它对java中的读者和作者都是公平的。在前两次运行中,程序运行正常,但当我运行了30个读卡器和3个写卡器时,程序停止运行。我不知道是什么原因。。。我创建了两个ReaderThread和WriterThread对象列表,并在一个main方法(此处不包括)中启动它们,然后通过这两个列表使用join(),这样创建的线程就不会出错。迄今为止的守则: public class ReaderWriter { static Loc
ReaderThread
和WriterThread
对象列表,并在一个main方法(此处不包括)中启动它们,然后通过这两个列表使用join()
,这样创建的线程就不会出错。迄今为止的守则:
public class ReaderWriter {
static Lock lock = new ReentrantLock();
static Lock queue = new ReentrantLock();
static Condition read = lock.newCondition();
static Condition write = lock.newCondition();
static AtomicInteger readWait = new AtomicInteger(0);
static AtomicInteger readActive = new AtomicInteger(0);
static AtomicInteger writeWait= new AtomicInteger(0);
static AtomicInteger writeActive = new AtomicInteger(0);
static StringBuilder str = new StringBuilder();
static int val = 0;
static class ReaderThread extends Thread {
@Override
public void run() {
try {
queue.lock();
lock.lock();
while (writeWait.get() > 0 )
read.await();
readWait.getAndIncrement();
read.signal();
queue.unlock();
lock.unlock();
System.out.println("Thread: " + Thread.currentThread().getId() + " is reading a string: " + str);
Thread.sleep(1500);
System.out.println("Thread: " + Thread.currentThread().getId() + " has stopped reading");
lock.lock();
readWait.getAndDecrement();
if (readWait.getAndDecrement() == 0 ) {
write.signal();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
static class WriterThread extends Thread {
@Override
public void run() {
try {
queue.lock();
lock.lock();
while(readWait.get() > 0 || writeWait.get() > 0)
write.await();
writeWait.getAndIncrement();
queue.unlock();
lock.unlock();
System.out.println("Thread: " + Thread.currentThread().getId() + " is writing");
str.append(val);
val++;
Thread.sleep(2000);
System.out.println("Thread: " + Thread.currentThread().getId() + " has stopped writing");
lock.lock();
writeWait.getAndDecrement();
if(writeWait.get() == 0) {
read.signal();
} else {
write.signal();
}
lock.unlock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
我从运行包含20个读卡器和2个写卡器的程序中得到的输出如下所示,它冻结在那里:
Thread: 13 is writing
Thread: 13 has stopped writing
Thread: 14 is reading a string: 0
Thread: 16 is reading a string: 0
Thread: 14 has stopped reading
Thread: 16 has stopped reading
然而,有时prgram只起作用,输出如下(20个读卡器和2个写卡器):
但通常情况下,这个项目还没有结束。我真的不确定这可能来自哪里,任何建议都将不胜感激 有没有可能在Linux上?类似的事情,涉及工作既没有完成也没有退出的线程。由于CPU_处理内部阵列的线程数(无/IO、无同步、无死锁),事情开始得很好,然后3个线程耗尽了其他线程的CPU,然后2个线程占主导地位,当它们完成时,就像程序忘记了其他线程一样。我可以在系统监视器上看到一切都是静止的 **更新** 让我的UncaughtExceptionHandler打印一些东西到输出,瞧,这里缺少了线程。程序没有停止,因为缺少的线程没有对int值线程进行倒计时。退出前,main会进行检查。给你的线程分配一个UncaughtExceptionHandler并吐出一些东西;也许它会提供信息 谢天谢地,程序员出错了。希望你也有同样的运气 更新2由OutOfMemoryError/堆空间导致的异常
Thread: 13 is writing
Thread: 13 has stopped writing
Thread: 14 is reading a string: 0
Thread: 14 has stopped reading
Thread: 12 is writing
Thread: 12 has stopped writing
Thread: 16 is reading a string: 01
Thread: 18 is reading a string: 01
Thread: 17 is reading a string: 01
Thread: 15 is reading a string: 01
Thread: 20 is reading a string: 01
Thread: 21 is reading a string: 01
Thread: 19 is reading a string: 01
Thread: 23 is reading a string: 01
Thread: 22 is reading a string: 01
Thread: 25 is reading a string: 01
Thread: 26 is reading a string: 01
Thread: 27 is reading a string: 01
Thread: 24 is reading a string: 01
Thread: 30 is reading a string: 01
Thread: 31 is reading a string: 01
Thread: 29 is reading a string: 01
Thread: 28 is reading a string: 01
Thread: 33 is reading a string: 01
Thread: 32 is reading a string: 01
Thread: 28 has stopped reading
Thread: 29 has stopped reading
Thread: 18 has stopped reading
Thread: 17 has stopped reading
Thread: 21 has stopped reading
Thread: 19 has stopped reading
Thread: 23 has stopped reading
Thread: 24 has stopped reading
Thread: 27 has stopped reading
Thread: 33 has stopped reading
Thread: 26 has stopped reading
Thread: 32 has stopped reading
Thread: 16 has stopped reading
Thread: 22 has stopped reading
Thread: 25 has stopped reading
Thread: 20 has stopped reading
Thread: 15 has stopped reading
Thread: 30 has stopped reading
Thread: 31 has stopped reading