首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

一路线程应用的试题

2012-08-28 
一道线程应用的试题网上找的,有人说疑似Google的多线程面试题: ??? 启动4个线程,向4个文件A,B,C,D里写入数

一道线程应用的试题

网上找的,有人说疑似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();???????}???}????}??}}}

?

热点排行