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项目中的多线程出现饥饿现象如何解决问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。