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
# 多线程饥饿现象
# 饥饿现象
# 如何实现Java线程安全问题
# 如何解决线程太多导致java socket连接池出现的问题
# Java多线程模拟售票程序和线程安全问题
# Java编程一道多线程问题实例代码
# 以银行取钱为例模拟Java多线程同步问题完整代码
# 完美解决Java中的线程安全问题
# 基于java线程安全问题及原理性分析
# 新手场景Java线程相关问题及解决方案
# 其他的
# 希望能
# 再来
# 还算
# 谢谢大家
# 解决方法
# 为了防止
# 多线程
# 正在等待
# void
# setWaittingWriten
# getFile
# return
# waittingWriten
# boolean
# isWaittingWriten
# file
# setWriterNumber
# getWriterNumber
# implements
相关文章:
如何在IIS服务器上快速部署高效网站?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
网站按钮制作软件,如何实现网页中按钮的自动点击?
建站之星北京办公室:智能建站系统与小程序生成方案解析
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
自助网站制作软件,个人如何自助建网站?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
如何在阿里云高效完成企业建站全流程?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
教程网站设计制作软件,怎么创建自己的一个网站?
怀化网站制作公司,怀化新生儿上户网上办理流程?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
建站之星免费版是否永久可用?
网站代码制作软件有哪些,如何生成自己网站的代码?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
C++如何使用std::optional?(处理可选值)
免费视频制作网站,更新又快又好的免费电影网站?
建站之星如何优化SEO以实现高效排名?
如何通过宝塔面板实现本地网站访问?
表情包在线制作网站免费,表情包怎么弄?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
上海网站制作开发公司,上海买房比较好的网站有哪些?
如何设计高效校园网站?
如何用景安虚拟主机手机版绑定域名建站?
高性价比服务器租赁——企业级配置与24小时运维服务
如何通过网站建站时间优化SEO与用户体验?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
如何通过PHP快速构建高效问答网站功能?
网站制作软件有哪些,制图软件有哪些?
如何基于云服务器快速搭建网站及云盘系统?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
如何在宝塔面板创建新站点?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
如何在IIS中新建站点并配置端口与IP地址?
如何通过虚拟主机快速完成网站搭建?
深圳网站制作的公司有哪些,dido官方网站?
建站之星后台密码遗忘?如何快速找回?
文字头像制作网站推荐软件,醒图能自动配文字吗?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
如何在阿里云虚拟主机上快速搭建个人网站?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
*请认真填写需求信息,我们会在24小时内与您取得联系。