java多スレッド飢餓現象の問題解決方法
java多スレッド飢餓現象の問題解決方法
スレッドが読んでいるときは、スレッドを書いてはいけませんが、他のスレッドを読んでください。スレッドが書いている時は、他のスレッドは読み書きしてはいけません。書き込みスレッドが飢餓状態にならないように、スレッドが読んでいます。スレッドを書いて書きたいなら、もう一回のスレッドを読んではいけません。
実現コードは以下の通りです。
File.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....
読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。