java多スレッド飢餓現象の問題解決方法


java多スレッド飢餓現象の問題解決方法
スレッドが読んでいるときは、スレッドを書いてはいけませんが、他のスレッドを読んでください。スレッドが書いている時は、他のスレッドは読み書きしてはいけません。書き込みスレッドが飢餓状態にならないように、スレッドが読んでいます。スレッドを書いて書きたいなら、もう一回のスレッドを読んではいけません。 
実現コードは以下の通りです。
File.Java

package readerWriter; 
 
public class File { 
private String name; 
public File(String name) 
{ 
  this.name=name; 
   
} 
} 
Pool.java

package readerWriter; 
 
public class Pool { 
private int readerNumber=0; 
private int writerNumber=0; 
private boolean waittingWriten; 
 
public boolean isWaittingWriten() { 
  return waittingWriten; 
} 
public void setWaittingWriten(boolean waittingWriten) { 
  this.waittingWriten = waittingWriten; 
} 
 
 
 
public File getFile() { 
  return file; 
} 
public void setFile(File file) { 
  this.file = file; 
} 
File file; 
public Pool(File file) 
{ 
  this.file=file; 
 
} 
public int getReaderNumber() { 
  return readerNumber; 
} 
public void setReaderNumber(int readerNumber) { 
  this.readerNumber = readerNumber; 
} 
public int getWriterNumber() { 
  return writerNumber; 
} 
public void setWriterNumber(int writerNumber) { 
  this.writerNumber = writerNumber; 
} 
 
} 
Reader.java

package readerWriter; 
 
public class Reader implements Runnable{ 
   
  private String id; 
  private Pool pool; 
   
   
  public Reader(String id,Pool pool) 
  { 
    this.id=id; 
    this.pool=pool; 
  } 
   
   
  @Override 
  public void run() 
  { 
    // TODO Auto-generated method stub 
    while(!Thread.currentThread().interrupted()){ 
       
    synchronized(pool){ 
       
        while(pool.getWriterNumber()>0 || pool.isWaittingWriten()==true)//         
                                        //        ,           
        { 
           
             
              try { 
                pool.wait(); 
              } catch (InterruptedException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
              } 
             
           
           
        } 
       
      { 
         
        pool.setReaderNumber(pool.getReaderNumber()+1);  
          
         
      } 
    } 
     System.out.println(id+" "+"is reading...."); 
      
     try { 
      Thread.sleep(1000); 
    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
   
    synchronized(pool) 
    { 
      pool.setReaderNumber(pool.getReaderNumber()-1);  
      System.out.println(id+"  "+"is existing the reader...."); 
      if(pool.getReaderNumber()==0) 
          pool.notifyAll(); 
    } try { 
      Thread.sleep(1000); 
    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
    // pool.notifyAll(); 
     
      
      
  } 
      
       
   
     
     
  } 
   
 
} 

Writer.java

package readerWriter; 
 
public class Writer implements Runnable{ 
  private Pool pool; 
  String id; 
  public Writer(String id,Pool pool) 
  { 
    this.id=id; 
    this.pool=pool; 
     
     
  } 
  @Override 
  public void run() { 
    // TODO Auto-generated method stub 
    while(!Thread.currentThread().interrupted()){ 
       
    synchronized(pool){ 
      if(pool.getReaderNumber()>0) 
        pool.setWaittingWriten(true); 
      else 
        pool.setWaittingWriten(false); 
     
      //                    
       
        while(pool.getWriterNumber()>0 ||  pool.getReaderNumber()>0)   
        { 
          try { 
            pool.wait();   
          } catch (InterruptedException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
          } 
           
        } 
      pool.setWaittingWriten(false);  //         
      { 
         
        pool.setWriterNumber(pool.getWriterNumber()+1); 
          
         
      } 
    } 
     System.out.println(id+" "+"is writing...."); 
 
     try { 
      Thread.sleep(1000); 
    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
      
     // 
    synchronized(pool) 
    { 
       
      pool.setWriterNumber(pool.getWriterNumber()-1); 
      System.out.println(id+"  "+"is existing the writer...."); 
      pool.notifyAll(); 
    } 
     /* try { 
        Thread.sleep(1000); 
        //System.out.println("writer sleeping over"); 
      } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
      } */ 
     
      
      
  } 
 
} 
} 
Main.java

package readerWriter; 
 
public class Main { 
 
  public static void main(String[] args) { 
    // TODO Auto-generated method stub 
Pool pool=new Pool(new File("dd file")); 
for(int i=0;i<2;i++) 
{ 
 Thread writer=new Thread(new Writer("writer "+i,pool)); 
 writer.start(); 
} 
for(int i=0;i<5;i++) 
{ 
   
  Thread reader=new Thread(new Reader("reader "+i,pool)); 
  reader.start(); 
   
 
} 
 
 
 
 
  } 
 
} 
プログラム部分の運転結果は以下の通りです。

writer 0 is writing.... 
writer 0  is existing the writer.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
writer 1 is writing.... 
writer 1  is existing the writer.... 
writer 1 is writing.... 
writer 1  is existing the writer.... 
writer 1 is writing.... 
writer 1  is existing the writer.... 
writer 1 is writing.... 
writer 1  is existing the writer.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
reader 0 is reading.... 
reader 0  is existing the reader.... 
writer 1 is writing.... 
writer 1  is existing the writer.... 
writer 1 is writing.... 
writer 1  is existing the writer.... 
writer 1 is writing.... 
writer 1  is existing the writer.... 
writer 1 is writing.... 
writer 1  is existing the writer.... 
writer 1 is writing.... 
writer 1  is existing the writer.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
reader 3 is reading.... 
reader 2 is reading.... 
reader 4 is reading.... 
reader 1 is reading.... 
reader 0 is reading.... 
reader 3  is existing the reader.... 
reader 1  is existing the reader.... 
reader 0  is existing the reader.... 
reader 4  is existing the reader.... 
reader 2  is existing the reader.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
writer 1 is writing.... 
writer 1  is existing the writer.... 
reader 2 is reading.... 
reader 2  is existing the reader.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
writer 0 is writing.... 
writer 0  is existing the writer.... 
writer 0 is writing.... 

読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。