• 技术文章 >Java >java教程

    java多线程饥饿现象的问题及解决办法

    零下一度零下一度2017-06-17 11:37:01原创1177
    这篇文章主要介绍了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....

    以上就是java多线程饥饿现象的问题及解决办法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:java 问题 现象 饥饿 线程
    上一篇:Java concurrency集合的详解 下一篇:详细介绍Spring boot 添加jsp支持配置的实例
    大前端线上培训班

    相关文章推荐

    • 理解java8中java.util.function.*pojo反射新方法(附代码)• 浅析安卓app和微信授权登录及分享完整对接(代码分享)• 教你一招搞定时序数据库在Spring Boot中的使用• 一招教你使用java快速创建Map(代码分享)• PlayFramework 完整实现一个APP(十一)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网