网上找的,有人说疑似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();
}
}
}
}
}
}
分享到:
相关推荐
Java编写的多线程C/S客户端考试系统是一个典型的分布式应用程序,它将客户端(Client)与服务器端(Server)分开,实现高效、稳定的考试服务。在这个系统中,Java语言以其跨平台性和丰富的类库成为了开发首选。下面...
在基于构件的开发模式中,应用系统作为一种构件被开发并运行在构件容器中,由容器为构件提供事务、线程、安全和生命周期等服务,构件开发者只专注于业务逻辑的开发。不符合构件-容器模型的遗留系统和企业现有系统则...
每一道试题都可能涉及到这些科目中的某个知识点,因此,考生需要对这些基础知识有深入的理解和熟练的应用。 例如,数据结构的上机试题可能要求考生编写一段代码,实现排序算法(如快速排序、归并排序)或者查找算法...
2015年试题的视频解析则更为详尽,通常由经验丰富的讲师或行业专家讲解,他们会逐一剖析每一道题目,解释解题思路,指出常见错误,帮助考生理解并掌握解题技巧。 在准备软件设计师考试的过程中,以下几个关键知识点...
【程序设计实用案例选讲】涉及的知识点主要围绕Java编程中的多线程应用和图形界面编程。以下是对这些主题的详细解析: 一、多线程应用 1. GUI线程: 在Java中,图形用户界面(GUI)由AWT和Swing库提供支持。在运行...
10. **设计模式**:试题可能涉及单例、工厂、观察者等常见设计模式的实现和应用场景。 11. **Java 8及以上的新特性**:例如lambda表达式、函数式接口、Stream API和日期时间API等。 每一道题目都可能伴随着详细的...
6. **操作系统基础**:进程与线程的概念、内存管理、文件系统、I/O操作等,这些是操作系统课程的基础知识,可能会出现在试题中。 7. **网络基础**:TCP/IP协议栈、HTTP协议、网络安全、网络编程等,这些网络基础...
SCJP,全称为Sun Certified Programmer for the Java 2 Platform Standard Edition,是由Oracle公司(原Sun Microsystems)...每一道题都应深入理解其背后的原理,而不仅仅是记住答案,这样才能在实际编程中灵活运用。
答案解析部分会详细解释每一道试题的正确答案,帮助考生理解错误之处,强化正确知识点,提高解题技巧。通过这些试题和解析,考生可以检验自己的知识掌握程度,查漏补缺,为考试做好充分准备。 在复习过程中,考生...
答案文档通常会详细解释每一道题目的解题过程和关键知识点,有助于深化理解并巩固学习成果。 在备考Java考试的过程中,考生应该注重以下几个方面: 1. **基础语法**:理解并熟练运用Java的基本语法,包括数据类型...
考生在研读试题时,不仅要关注答案,更要深入理解每一道题背后所涵盖的知识点,以此来提高自身的理论素养和实战能力。 总的来说,软考软件设计师考试是对软件设计人员综合能力的一次全面检验,它要求考生具备深厚的...
6. **多线程**:掌握Thread类的使用,理解同步机制,如synchronized关键字、wait()、notify()方法,以及线程池的概念。 7. **反射API**:学习如何在运行时获取类的信息,动态调用方法,创建对象,以及修改类的属性...
`Vector`是一种线程安全的动态数组,适用于多线程环境下的数据操作。`remove`方法用于移除并返回指定位置的元素,确保每次抽取的中奖者不会重复。 ### 2. 进制转换 此题涉及将三进制数字转换为十进制的问题,这是...
2014年海康嵌入式笔试部分试题 一、模态窗口与非模态窗口 在计算机科学中,模态窗口(Modal Window)和非模态窗口(Non-Modal Window)是两种不同的窗口类型。模态窗口是指在显示该窗口时,其他所有窗口都将被禁用...
答案解析部分是此压缩包的核心价值,它详细解释了每一道题目的正确答案和解题思路。对于选择题,解析会指出每个选项的正确与否,并给出原因;对于填空题和简答题,不仅会给出标准答案,还会阐述背后的理论依据,帮助...
这是一道考察基础知识的选择题,旨在测试考生对Visual FoxPro命令的记忆和理解。 - **应用场景**:在实际项目中,打开数据库通常是开发流程的第一步,以便后续进行数据的查询、更新等操作。 #### 排序算法的性能...
另一道题目可能涉及到线程同步,需要使用`synchronized`关键字或wait/notify机制来解决并发问题。 在学习Java时,掌握基本语法是至关重要的,这包括变量、常量、运算符、控制结构(如if语句和循环)、方法定义和...
### 2018年研究生全国统考计算机试题-操作系统部分试题解析 #### 单项选择题解析 **23. 下列关于多任务操作系统的叙述中,正确的是____。** - **Ⅰ.具有并发和并行的特点** - **Ⅱ.需要实现对共享资源的保护** ...
1. 题目提到的合法声明:这是一道关于C语言声明合法性的题目。选项B "a(5);" 是合法的,它代表一个长度为5的数组声明,而其他选项不符合C语言的语法。 2. Word滚动条按钮:在Word中,单击垂直滚动条的"↓"按钮,...