一道线程应用的试题
网上找的,有人说疑似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();???????}???}????}??}}}?