欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

放号器

程序员文章站 2022-03-03 20:33:25
多线程放号器1、使用implements Runnable 实现线程操作先创建一个文件从流中读取一个整数随机获取号码,将号码写入文件对号码同步化提高安全性不会出现重复的在获取名字和号码输出package com.softeem.examination3;import java.io.EOFException;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;imp...

多线程放号器

1、

使用implements Runnable 实现线程操作
先创建一个文件从流中读取一个整数
随机获取号码,将号码写入文件
对号码同步化提高安全性不会出现重复的
在获取名字和号码输出


package com.softeem.examination3;

import java.io.EOFException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Random;



public class Hospital implements Runnable {
	
	private int num;
	private String cacheFile = "record.txt";
	private RandomAccessFile raf;
	
	{
		try {
			raf = new RandomAccessFile(cacheFile, "r");
			//从流中读取一个整数(上一次最后写入的号码)
			num = raf.readInt();
		} catch (FileNotFoundException e) {
			System.out.println("文件不存在,创建文件");
			try {
				new File(cacheFile).createNewFile();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}catch (EOFException e){
			//当从流中读取不到需要的内容时
			System.out.println("没有可读号码");
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
			if (raf != null)raf.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} {
				
			}
		}
	}
	
	@Override
	public void run() {
		while (true) {
			//对号码获取和变更需要同步加锁
			synchronized (this) {
				try {
					Thread.sleep(new Random().nextInt(100));
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			//对号码的获取和变更需要同步
			synchronized (this) {
			num++;
			System.out.println(Thread.currentThread().getName()+"取到号码"+num);
			try (RandomAccessFile reader = new RandomAccessFile(cacheFile, "rw")) {
				//将获取的号码写入文件
				//将文件指针设置到流的开头
				reader.seek(0);
				reader.writeInt(num);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			}
		}		
	}

	public static void main(String[] args) {
		Hospital sender = new Hospital();
		
		Thread t1 = new Thread(sender, "患者A");
		Thread t2 = new Thread(sender, "患者B");
		Thread t3 = new Thread(sender, "患者C");
		
		t1.start();
		t2.start();
		t3.start();

	}

}


本文地址:https://blog.csdn.net/weixin_49172078/article/details/107603950

相关标签: java