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

📄 readerwriter.java

📁 实现操作系统几个经典问题:生产者消费者,读者写者,哲学家进餐问题.共做一个界面
💻 JAVA
字号:
/*
 * ReaderWriter.java
 *
 * Created on 2007年7月15日, 上午12:28
 */

package processSyn;

import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import javax.imageio.*;
/**
 *
 * @author  jzf
 */
public class ReaderWriter extends javax.swing.JPanel {
    
    /** Creates new form ReaderWriter */
    public ReaderWriter(){
        
    }
    public ReaderWriter(int width,int height) {
        initComponents();
        buff=new Buffer();
        this.width=width;
        this.height=height;
        /*try {
            URL url=this.getClass().getResource("../osimg.jpg");
            File file=new File(url.toURI());
            img=ImageIO.read(file);
        } catch (URISyntaxException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }*/
    }
    public void paintComponent(Graphics g){
        if(img!=null){
            int x=(width-img.getWidth(null))/2;
            //g.drawImage(img,x,90,null);
            g.drawString("下面的这本书模拟被读或写的文件:",x/2-x/4,65);
        }
        
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" 生成的代码 ">//GEN-BEGIN:initComponents
    private void initComponents() {
        addReaderButton = new javax.swing.JButton();
        addWriterButton = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        stateLabel = new javax.swing.JLabel();
        readerList = new java.awt.List();
        writerList = new java.awt.List();

        addReaderButton.setText("\u8bfb");
        addReaderButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addReaderButtonActionPerformed(evt);
            }
        });

        addWriterButton.setText("\u5199");
        addWriterButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addWriterButtonActionPerformed(evt);
            }
        });

        jLabel1.setText("\u8bfb\u8005\u961f\u5217\uff1a");

        jLabel2.setText("\u5199\u8005\u961f\u5217\uff1a");

        stateLabel.setBackground(new java.awt.Color(255, 255, 255));
        stateLabel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 153, 255)));
        stateLabel.setOpaque(true);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(readerList, javax.swing.GroupLayout.PREFERRED_SIZE, 119, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(stateLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 154, Short.MAX_VALUE))
                            .addGroup(layout.createSequentialGroup()
                                .addGap(101, 101, 101)
                                .addComponent(addReaderButton)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 92, Short.MAX_VALUE)
                                .addComponent(addWriterButton)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(writerList, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 85, Short.MAX_VALUE)
                        .addGap(229, 229, 229)
                        .addComponent(jLabel2)
                        .addGap(66, 66, 66))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(addReaderButton)
                    .addComponent(addWriterButton))
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(39, 39, 39)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel2)
                            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(readerList, javax.swing.GroupLayout.DEFAULT_SIZE, 173, Short.MAX_VALUE)
                            .addComponent(writerList, javax.swing.GroupLayout.DEFAULT_SIZE, 173, Short.MAX_VALUE)))
                    .addComponent(stateLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(54, 54, 54))
        );
    }// </editor-fold>//GEN-END:initComponents
    
    private void addWriterButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addWriterButtonActionPerformed
// TODO 将在此处添加您的处理代码:
        new Writer(buff,m_writerCount++).start();
    }//GEN-LAST:event_addWriterButtonActionPerformed
    
    private void addReaderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addReaderButtonActionPerformed
// TODO 将在此处添加您的处理代码:
        new Reader(buff,m_readerCount++).start();
    }//GEN-LAST:event_addReaderButtonActionPerformed
    
    class Reader extends Thread{
        private Buffer server;
        private int readerNum;   //读者的编号
        public Reader(Buffer bf,int r) {
            super();
            readerNum=r;
            server=bf;
        }
        public int getReaderId(){
            return readerNum;
        }
        public void run() {
            int c;
            readerList.add("读者 "+readerNum+" 想读。",readerNum);
            stateLabel.setText("读者 "+readerNum+" 想读。");
            try {
                Thread.sleep((int)(Math.random()*2000)); //随机睡眠2秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //readerList.remove(readerNum);
            readerList.add("读者 "+readerNum+" 等待...",readerNum);
            stateLabel.setText("读者 "+readerNum+" 等待...");
            c=server.startRead();
            //readerList.remove(readerNum);
            readerList.add("读者 "+readerNum+" 正在读。",readerNum);
            stateLabel.setText("读者 "+readerNum+" 正在读...,现有读者数量:"+c);
            try {
                Thread.sleep((int)(Math.random()*2000)); //随机睡眠2秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            c=server.endReading();
            //readerList.remove(readerNum);
            readerList.add("读者 "+readerNum+" 读完。",readerNum);
            stateLabel.setText("读者 "+readerNum+" 读, "+"现有读者数量:"+c);
        }
    }
    
    class Writer extends Thread{
        private Buffer server;
        private int writerNum; //写者的编号
        public Writer(Buffer bf,int w) {
            super();//调用父类的构造函数
            writerNum=w;
            server=bf;
        }
        public int getWriterId(){
            return writerNum;
        }
        public void run(){
            writerList.add("写者 "+writerNum+" 想写。",writerNum);
            stateLabel.setText("写者 "+writerNum+" 想写。");
            try {
                Thread.sleep((int)(Math.random()*6000)+3000); //随机睡眠2秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //writerList.remove(writerNum);
            writerList.add("写者 "+writerNum+" 等待...",writerNum);
            stateLabel.setText("写者 "+writerNum+" 等待...");
            server.startWriting();
            //writerList.remove(writerNum);
            writerList.add("写者 "+writerNum+" 正在写...",writerNum);
            stateLabel.setText("写者 "+writerNum+" 正在写...");
            try {
                Thread.sleep((int)(Math.random()*6000)+3000); //随机睡眠2秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            server.endWriting();
            //writerList.remove(writerNum);
            writerList.add("写者 "+writerNum+" 写完。",writerNum);
            stateLabel.setText("写者 "+writerNum+" 写完。");
        }
    }
    
    class Buffer {
        private int readerCount;
        private int writerCount;
        private boolean bfReading;
        private boolean bfWriting;
        public Buffer() {
            super();
            readerCount=0;
            writerCount=0;
            bfReading=false;
            bfWriting=false;
            
        }
        public synchronized int startRead(){
            while(writerCount>0){
                try{
                    wait();
                } catch(Exception e){
                    System.out.println(e.toString());
                    e.printStackTrace();
                }
            }
            ++readerCount;
            if(readerCount==1){
                bfReading=true;// 修改读状态值。
            }
            return readerCount; //返回读者数量
            
        }
        public synchronized int endReading(){
            --readerCount;
            if(readerCount==0){
                bfReading=false;
            }
            notifyAll();//唤醒其它线程
            
            
            return readerCount;
        }
        
        public synchronized void startWriting(){
            ++writerCount;
            while(bfReading==true||bfWriting==true){//如果有读者在读或者写者在写就执行下面
                try{
                    wait();
                } catch(Exception e){
                    System.out.println(e.toString());
                }
                
            }
            
            bfWriting=true;// 修改读状态值
        }
        
        public synchronized void endWriting(){
            --writerCount;
            bfWriting=false;
            notifyAll();
        }
    }
    // 变量声明 - 不进行修改//GEN-BEGIN:variables
    private javax.swing.JButton addReaderButton;
    private javax.swing.JButton addWriterButton;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private java.awt.List readerList;
    private javax.swing.JLabel stateLabel;
    private java.awt.List writerList;
    // 变量声明结束//GEN-END:variables
    private Buffer buff;
    private Image img;
    private int width,height;
    private int m_readerCount=0;
    private int m_writerCount=0;
}

⌨️ 快捷键说明

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