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项目中的多线程出现饥饿现象如何解决