代码都已上传github
P04 有四个线程1、2、3、4。线程1的功能就是输出A,线程2的功能就是输出B,以此类推
现在有四个文件file1,file2,file3, file4。初始都为空。
现要让四个文件呈如下格式:
file1:A B C D A B....
file2:B C D A B C....
file3:C D A B C D....
file4:D A B C D A....
心得
- 虽然是4个线程,但是还是不能做到对4个文件同时进行读写。感觉以后可以继续优化
- 在对同步局域用Lock 上锁的时候会出现
java.lang.IllegalMonitorStateException
的问题,网上查了一下。有一个说法是
在对某个对象上调用wait()方法进行线程等待(让其他竞争执行该代码的线程上锁)时,没有对该对象执行同步操作。
所以解决方法是:
synchronized (xxxx) {
xxxx.wait();
}
代码
核心代码
//确定第几个线程可以输出
//如果换了输出文本,那么就要限制第一个输出的线程
public static void changeThread(){
if (count % 8 == 0) {
ThreadNumber =FileNumber +2;
if(ThreadNumber>=4){
ThreadNumber = 4;
}
}
}
//变更输出文本 当一个文本写入8个的时候就进行切换文本
public static void changeFile() {
if(count %8 ==0){
FileNumber++;
if(FileNumber>=4){
FileNumber = 3;
}
}
}
public static void out(char a) {
synchronized (lock) {
Integer integer = Integer.valueOf(Thread.currentThread().getName());
while (integer != ThreadNumber) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
changeFile();
try {
FileWriter fileWriter = new FileWriter(files[FileNumber], true);
System.out.println("将要写入字符 " + a);
fileWriter.write(a);
fileWriter.flush();
fileWriter.close();
count++;
//改变线程
if (integer % 4 == 0) {
ThreadNumber = 1;
} else {
ThreadNumber++;
}
changeThread();
lock.notifyAll();
} catch (IOException e) {
e.printStackTrace();
}
}
}
网友评论