一个经典的多线程的例子,可以创建多个线程同时进行报号,并且号码不重复,
具有存档功能,程序再次启动时会从上次报的号码继续开始
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Demo implements Runnable {
private int num;
private String StoreFile = "r.dat"; //可以替换成任意其他目录
private RandomAccessFile raf;
{
try {
raf = new RandomAccessFile(StoreFile, "r");
} catch (FileNotFoundException e) {
System.out.println("找不到文件");
try {
new File(StoreFile).createNewFile();
} catch (IOException e1) {
e1.printStackTrace();
}
}
try {
num = raf.readInt();
} catch (IOException e) {
num = 0;
System.out.println("没有记录");
} finally {
if (raf != null)
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
num++;
System.out.println(Thread.currentThread().getName() + "出号--->" + num);
try (RandomAccessFile reader = new RandomAccessFile(StoreFile, "rw")) {
reader.seek(0);
reader.writeInt(num);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Demo d = new Demo();
Thread t1 = new Thread(d, "挂号机1");
Thread t2 = new Thread(d, "挂号机2");
Thread t3 = new Thread(d, "挂号机3");
Thread t4 = new Thread(d, "挂号机4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}