网上找的,有人说疑似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();
}
}
}
}
}
}
分享到:
相关推荐
多线程应用程序设计
多线程应用程序设计
在C#中编写多线程应用程序,简单! 菜鸟必备
操作系统原理线程概念与应用 操作系统原理线程概念与应用
NULL 博文链接:https://raidyue.iteye.com/blog/1616742
2.2多线程应用程序设计,适合初学者,相当可以的啊
易语言源码易语言鱼刺类多线程应用v5.1源码.rar 易语言源码易语言鱼刺类多线程应用v5.1源码.rar 易语言源码易语言鱼刺类多线程应用v5.1源码.rar 易语言源码易语言鱼刺类多线程应用v5.1源码.rar 易语言源码易语言...
线程及多线程技术及应用线程及多线程技术及应用
netty中的多线程并发应用,
用Pro*C开发多线程应用程序 (注:本文来自Pro*C/C++ Precompiler Programmer's Guide Release 8.1.5) 如果你的操作系统不支持线程,本文暂不适合你。本文包含以下几个部分: n 什么是多线程? n Pro*C中的运行时上...
使用多线程时遇到的问题,并提出那些常见陷阱的解决方案。
理解多线程,写一个多线程应用程序,要求能在用户级实现线程的调度,如启动、挂起、恢复、停止,的C thread、java thread实现。
用PB编写多线程应用程序,使程序更有效率
本设计是在多线程的原理基础上设计的多线程应用程序设计—监控软件,实现了多个线程并发执行的要求,可以对摄像头采集的图片数据及时处理。
MFC 多线程应用, 包括工作线程, 用户界面线程, 例子多达9个,欢迎下载测试
本资源包含一个多线程应用的实例开发,希望大家能够通过该实例学习到有关的知识点。
他是一个多线程应用的例。多初学者来说是个不错的选择
线程——基本线程的应用和线程调用控件线程——基本线程的应用和线程调用控件