有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:
A:1 2 3 4 1 2....
B:2 3 4 1 2 3....
C:3 4 1 2 3 4....
D:4 1 2 3 4 1....
请设计程序。
程序:
思路:
观察文件内容可得线程1 访问文件的次序为 A-B-C-D-A-B-C-D.....
线程2 访问文件的次序为 B-A-D-C-B-A-D-C
线程3 访问文件的次序为 C-B-A-D-C-B-A-D
线程4 访问文件的次序为 D-C-B-A-D-C-B-A
所以可以这样设计程序,使用CyclicBarrier 类,线程1 访问A,然后调用CyclicBarrier 的await方法.线程2 访问B,然后调用CyclicBarrier 的await方法.线程3 访问C,然后调用CyclicBarrier 的await方法。线程4 访问D,然后调用CyclicBarrier 的await方法。此时四个线程都访问完了文件,并处在同一”起跑线上“。接着线程1 访问B,然后调用CyclicBarrier 的await方法,其他线程依次类推。
代码如下:
public class Google {
public static void main(String[] args) throws IOException {
File fa = new File("G:/A.txt");
File fb = new File("G:/B.txt");
File fc = new File("G:/C.txt");
File fd = new File("G:/D.txt");
FileWriter fisa ;
FileWriter fisb ;
FileWriter fisc ;
FileWriter fisd ;
//new InputStreamReader(new FileInputStream(file),"UTF-8")
fisa =new FileWriter(fa);
fisb = new FileWriter(fb);
fisc = new FileWriter(fc);
fisd = new FileWriter(fd);
CyclicBarrier cb = new CyclicBarrier(4);
new Thread(new Taska(fisa,fisb,fisc,fisd,cb)).start();
new Thread(new Taskb(fisa,fisb,fisc,fisd,cb)).start();
new Thread(new Taskc(fisa,fisb,fisc,fisd,cb)).start();
new Thread(new Taskd(fisa,fisb,fisc,fisd,cb)).start();
}
}
class Taska implements Runnable{
CyclicBarrier cb ;
FileWriter fisa ;
FileWriter fisb ;
FileWriter fisc ;
FileWriter fisd ;
public Taska(
FileWriter fisa ,
FileWriter fisb ,
FileWriter fisc ,
FileWriter fisd ,
CyclicBarrier cb){
try {
this.fisa = fisa;
this.fisb = fisb;
this.fisc = fisc;
this.fisd = fisd;
this.cb = cb;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
try {
while(true){
fisa.write("1");
fisa.flush();
cb.await();
fisd.write("1");
fisd.flush();
cb.await();
fisc.write("1");
fisc.flush();
cb.await();
fisb.write("1");
fisb.flush();
cb.await();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Taskb implements Runnable{
CyclicBarrier cb ;
FileWriter fisa ;
FileWriter fisb ;
FileWriter fisc ;
FileWriter fisd ;
public Taskb(
FileWriter fisa ,
FileWriter fisb ,
FileWriter fisc ,
FileWriter fisd ,
CyclicBarrier cb){
try {
this.fisa = fisa;
this.fisb = fisb;
this.fisc = fisc;
this.fisd = fisd;
this.cb = cb;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
try {
while(true){
fisb.write("2");
fisb.flush();
cb.await();
fisa.write("2");
fisa.flush();
cb.await();
fisd.write("2");
fisd.flush();
cb.await();
fisc.write("2");
fisc.flush();
cb.await();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Taskc implements Runnable{
CyclicBarrier cb ;
FileWriter fisa ;
FileWriter fisb ;
FileWriter fisc ;
FileWriter fisd ;
public Taskc(
FileWriter fisa ,
FileWriter fisb ,
FileWriter fisc ,
FileWriter fisd ,
CyclicBarrier cb){
try {
this.fisa = fisa;
this.fisb = fisb;
this.fisc = fisc;
this.fisd = fisd;
this.cb = cb;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
try {
while(true){
fisc.write("3");
fisc.flush();
cb.await();
fisb.write("3");
fisb.flush();
cb.await();
fisa.write("3");
fisa.flush();
cb.await();
fisd.write("3");
fisd.flush();
cb.await();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Taskd implements Runnable{
CyclicBarrier cb ;
FileWriter fisa ;
FileWriter fisb ;
FileWriter fisc ;
FileWriter fisd ;
public Taskd(
FileWriter fisa ,
FileWriter fisb ,
FileWriter fisc ,
FileWriter fisd ,
CyclicBarrier cb){
try {
this.fisa = fisa;
this.fisb = fisb;
this.fisc = fisc;
this.fisd = fisd;
this.cb = cb;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
try {
while(true){
fisd.write("4");
fisd.flush();
cb.await();
fisc.write("4");
fisc.flush();
cb.await();
fisb.write("4");
fisb.flush();
cb.await();
fisa.write("4");
fisa.flush();
cb.await();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}