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