⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readerswriters.java

📁 英国帝国理工学院电脑系多线程课程教学材料之十二 ---- 读取者与写入者范例(starvation修正版)
💻 JAVA
字号:
//@author: j.n.magee 11/11/96
package concurrency.readwrite;

import java.awt.*;
import java.applet.*;
import concurrency.display.*;

/********************************************************/

class Reader implements Runnable {

    ReadWrite lock_;

    Reader(ReadWrite lock) {
        lock_ = lock;
    }

    public void run() {
      try {
        while(true)  {
            while(!ThreadPanel.rotate());
            // begin critical section
            lock_.acquireRead();
            while(ThreadPanel.rotate());
            lock_.releaseRead();
        }
      } catch (InterruptedException e){}
    }
}

/********************************************************/

class Writer implements Runnable {

    ReadWrite lock_;

    Writer(ReadWrite lock) {
        lock_ = lock;
    }

    public void run() {
      try {
        while(true)  {
            while(!ThreadPanel.rotate());
            // begin critical section
            lock_.acquireWrite();
            while(ThreadPanel.rotate());
            lock_.releaseWrite();
        }
      } catch (InterruptedException e){}
    }
}

/********************************************************/

public class ReadersWriters extends Applet {

    ThreadPanel read1;
    ThreadPanel read2;
    ThreadPanel write1;
    ThreadPanel write2;
    StringCanvas display;
    String rwClass;

    public void init() {
        rwClass = getParameter("rwClass");
        setLayout(new BorderLayout());
        add("Center",display=new StringCanvas(rwClass));
        display.setSize(630,100);
        Panel p = new Panel();
        p.add(read1 =new ThreadPanel("Reader 1",Color.blue,true));
        p.add(read2 =new ThreadPanel("Reader 2",Color.blue,true));
        p.add(write1=new ThreadPanel("Writer 1",Color.yellow,true));
        p.add(write2=new ThreadPanel("Writer 2",Color.yellow,true));
        add("South",p);
		setBackground(Color.lightGray);
    }

    public void start() {
        DisplayReadWrite lock;
        if (rwClass.equals("ReadWriteSafe"))
           lock = new DisplayReadWrite(display,new ReadWriteSafe());
        else if (rwClass.equals("ReadWritePriority"))
           lock = new DisplayReadWrite(display,new ReadWritePriority());
        else if (rwClass.equals("ReadWriteFair"))
           lock = new DisplayReadWrite(display,new ReadWriteFair());
        else
            lock = new DisplayReadWrite(display,new ReadWriteSafe());
        read1.start(new Reader(lock));
        read2.start(new Reader(lock));
        write1.start(new Writer(lock));
        write2.start(new Writer(lock));
    }

    public void stop() {
        read1.stop();
        read2.stop();
        write1.stop();
        write2.stop();
     }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -