代碼都已上傳github
P04 有四個線程1赛惩、2、3趁餐、4喷兼。線程1的功能就是輸出A,線程2的功能就是輸出B后雷,以此類推
現(xiàn)在有四個文件file1,file2,file3, file4季惯。初始都為空。
現(xiàn)要讓四個文件呈如下格式:
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個文件同時進行讀寫勉抓。感覺以后可以繼續(xù)優(yōu)化
- 在對同步局域用Lock 上鎖的時候會出現(xiàn)
java.lang.IllegalMonitorStateException
的問題,網(wǎng)上查了一下候学。有一個說法是
在對某個對象上調(diào)用wait()方法進行線程等待(讓其他競爭執(zhí)行該代碼的線程上鎖)時藕筋,沒有對該對象執(zhí)行同步操作。
所以解決方法是:
synchronized (xxxx) {
xxxx.wait();
}
代碼
核心代碼
//確定第幾個線程可以輸出
//如果換了輸出文本梳码,那么就要限制第一個輸出的線程
public static void changeThread(){
if (count % 8 == 0) {
ThreadNumber =FileNumber +2;
if(ThreadNumber>=4){
ThreadNumber = 4;
}
}
}
//變更輸出文本 當(dāng)一個文本寫入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();
}
}
}