代碼都已上傳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();
}
}
}