java项目中的多线程出现饥饿现象如何解决

  

java项目中的多线程出现饥饿现象如何解决?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强> java多线程饥饿现象的问题解决方法

当有线程正在读的时候,不允许写线程写,但是允许其他的读线程进行读。有写线程正在写的时候,其他的线程不应该读写。为了防止写线程出现饥饿现象,当线程正在读,如果写线程请求写,那么应该禁止再来的读线程进行读只

<强>实现代码如下:

<强>文件。Java

包readerWriter;
  
  公共类文件{
  私人字符串名称;
  公共文件(字符串名称)
  {
  this.name=名称;
  
  }
  }
  

<强>池。java

包readerWriter;
  
  公共类池{
  私人int readerNumber=0;
  私人int writerNumber=0;
  私人布尔waittingWriten;
  
  公共布尔isWaittingWriten () {
  返回waittingWriten;
  }
  公共空间setWaittingWriten(布尔waittingWriten) {
  这一点。waittingWriten=waittingWriten;
  }
  
  
  
  公共文件getFile () {
  返回文件;
  }
  公共空间setFile(文件文件){
  这一点。文件=文件;
  }
  文件文件;
  公共游泳池(文件文件)
  {
  this.file=文件;
  
  }
  公共int getReaderNumber () {
  返回readerNumber;
  }
  公共空间setReaderNumber (int readerNumber) {
  这一点。readerNumber=readerNumber;
  }
  公共int getWriterNumber () {
  返回writerNumber;
  }
  公共空间setWriterNumber (int writerNumber) {
  这一点。writerNumber=writerNumber;
  }
  
  }
  

<强>读者。java

包readerWriter;
  
  公共类读者实现Runnable {
  
  私人字符串id;
  私人游泳池池;
  
  
  公众读者(String id,池池)
  {
  this.id=id;
  this.pool=池;
  }
  
  
  @Override
  公共空间run ()
  {//TODO自动生成方法存根
  而(! Thread.currentThread () .interrupted ()) {
  
  同步(池){
  
  而(pool.getWriterNumber()在0 | | pool.isWaittingWriten ()==true)//当线程正在写或者//有线程正在等待写,则禁止读线程继续读
  {
  
  
  尝试{
  pool.wait ();
  }捕捉(InterruptedException e) {//TODO自动生成的catch块
  e.printStackTrace ();
  }
  
  
  
  }
  
  {
  
  pool.setReaderNumber (pool.getReaderNumber () + 1);
  
  
  }
  }
  System.out.println (id +“;“+”是阅读....“);
  
  尝试{
  thread . sleep (1000);
  }捕捉(InterruptedException e) {//TODO自动生成的catch块
  e.printStackTrace ();
  }
  
  同步(池)
  {
  pool.setReaderNumber (pool.getReaderNumber () 1);
  System.out.println (id +“;“+”是现有读者....“);
  如果(pool.getReaderNumber ()==0)
  pool.notifyAll ();
  }{试
  thread . sleep (1000);
  }捕捉(InterruptedException e) {//TODO自动生成的catch块
  e.printStackTrace ();
  }//pool.notifyAll ();
  
  
  
  }
  
  
  
  
  
  }
  
  
  }
  
  

<强>作家。java

包readerWriter;
  
  公共类作家实现Runnable {
  私人游泳池池;
  字符串id;
  公共作家(String id,池池)
  {
  this.id=id;
  this.pool=池;
  
  
  }
  @Override
  公共空间run () {//TODO自动生成方法存根
  而(! Thread.currentThread () .interrupted ()) {
  
  同步(池){
  如果(pool.getReaderNumber()在0)
  pool.setWaittingWriten(真正的);
  其他的
  pool.setWaittingWriten(假);//当线程正在被读或者被写或者有线程等待读
  
  而(pool.getWriterNumber()在0 | | pool.getReaderNumber()在0)
  {
  尝试{
  pool.wait ();
  }捕捉(InterruptedException e) {//TODO自动生成的catch块
  e.printStackTrace ();
  }
  
  }
  pool.setWaittingWriten(假);//这个策略还算公平
  {
  
  pool.setWriterNumber (pool.getWriterNumber () + 1);
  
  
  }
  }
  System.out.println (id +“;“+“写....“);
  
  尝试{
  thread . sleep (1000);
  }捕捉(InterruptedException e) {//TODO自动生成的catch块
  e.printStackTrace ();
  }//同步(池)
  {
  
  pool.setWriterNumber (pool.getWriterNumber () 1);
  System.out.println (id +“;“+“现有作者....“);
  pool.notifyAll ();
  }/*{试
  thread . sleep (1000);//System.out.println(“作家睡over");
  }捕捉(InterruptedException e) {//TODO自动生成的catch块
  e.printStackTrace ();
  } */}
  
  }
  }
  

java项目中的多线程出现饥饿现象如何解决