Google面试题 多线程写文件

来源:互联网 发布:淘宝hm代购是真的吗 编辑:程序博客网 时间:2024/05/16 09:27

有四个线程1、234。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:

A1 2 3 4 1 2....

B2 3 4 1 2 3....

C3 4 1 2 3 4....

D4 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 blocke.printStackTrace();}   }@Overridepublic 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 blocke.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 blocke.printStackTrace();}   }@Overridepublic 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 blocke.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 blocke.printStackTrace();}   }@Overridepublic 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 blocke.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 blocke.printStackTrace();}   }@Overridepublic 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 blocke.printStackTrace();  }}      }


0 0