`
lenozhi
  • 浏览: 51042 次
社区版块
存档分类
最新评论

一道线程应用的试题

阅读更多

网上找的,有人说疑似Google的多线程面试题:
    启动4个线程,向4个文件A,B,C,D里写入数据,每个线程只能写一个值。
    线程1:只写1
    线程2:只写2
    线程3:只写3
    线程4:只写4
    4个文件A,B,C,D。
    程序运行起来,4个文件的写入结果如下:
    A:12341234...
    B:23412341...
    C:34123412...
    D:41234123...

 

 

思路:用ConcurrentLinkedQueue类调度线程执行的执行的顺序,例:

       事先准备针对4个文件写入顺序的队列:

   Queue[] queue = new  ConcurrentLinkedQueue[4];
  queue[1].add("1");queue[1].add("2");queue[1].add("3");queue[1].add("4");
  queue[2].add("2");queue[2].add("3");queue[2].add("4");queue[2].add("1");
  queue[3].add("3");queue[3].add("4");queue[3].add("1");queue[3].add("2");
  queue[4].add("4");queue[4].add("1");queue[4].add("2");queue[4].add("3");
工作线程类
class Worker extends Thread {
 
 private Queue[] queue;                //分别代表 A,B,C,D四个文件的写入顺序,参数传入
 private FileOutputStream[] fos;   //分别代表4个文件
 private String name;                  // 线程名字:1,2,3,4  用于从queue中取出的值比较
 
 

具体代码如下:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
public class TT {
 /**
  * @param args
  * @throws FileNotFoundException 
  */
 public static void main(String[] args) throws FileNotFoundException {
  // TODO Auto-generated method stub
  ConcurrentLinkedQueue[] queue = new ConcurrentLinkedQueue[5];
  FileOutputStream[] fos = new FileOutputStream[4];
  
  Object o = new Object();
  for ( int i=1; i<5; i++){
   queue[i] = new ConcurrentLinkedQueue();
   fos[i-1] = new FileOutputStream(new File("D:\\"+i+".txt"));
  }
  queue[1].add("t1");queue[1].add("t2");queue[1].add("t3");queue[1].add("t4");
  queue[2].add("t2");queue[2].add("t3");queue[2].add("t4");queue[2].add("t1");
  queue[3].add("t3");queue[3].add("t4");queue[3].add("t1");queue[3].add("t2");
  queue[4].add("t4");queue[4].add("t1");queue[4].add("t2");queue[4].add("t3");
  
  
  Worker[] w  = new Worker[4];
  for (int i=1; i<5; i++){
   w[i-1] = new Worker(queue,"t"+i,o,fos);
   w[i-1].start();
   
  }
   
 }
}
class Worker extends Thread {
 
 private Queue[] queue;
 private FileOutputStream[] fos;
 private String name;
 private Object lock;
 public Worker (Queue[] queue, String name,Object lock,FileOutputStream[] fos){
  this.queue = queue;
  this.name = name;
  this.lock = lock;
  this.fos = fos;
 }
 
 public void run() {
  for (;;){
   
   for (int i=1;i<queue.length; i++){
    synchronized(fos[i-1]){
    if (((String)queue[i].peek()).equals(name)){
     Object o = queue[i].poll();
      try {
       fos[i-1].write(name.getBytes());
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     queue[i].add(o);
    }
    try {
     Thread.sleep(50);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   
    }
   } 
   }
  }
}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics