`
lenozhi
  • 浏览: 52470 次
社区版块
存档分类
最新评论

一道线程应用的试题

阅读更多

网上找的,有人说疑似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客户端的考试系统

    Java编写的多线程C/S客户端考试系统是一个典型的分布式应用程序,它将客户端(Client)与服务器端(Server)分开,实现高效、稳定的考试服务。在这个系统中,Java语言以其跨平台性和丰富的类库成为了开发首选。下面...

    2007年下半年系统分析师考试试题分析.doc

    在基于构件的开发模式中,应用系统作为一种构件被开发并运行在构件容器中,由容器为构件提供事务、线程、安全和生命周期等服务,构件开发者只专注于业务逻辑的开发。不符合构件-容器模型的遗留系统和企业现有系统则...

    北大自考计算机专业各科历年上机试题.rar

    每一道试题都可能涉及到这些科目中的某个知识点,因此,考生需要对这些基础知识有深入的理解和熟练的应用。 例如,数据结构的上机试题可能要求考生编写一段代码,实现排序算法(如快速排序、归并排序)或者查找算法...

    软件设计师考试解析视频试题.rar

    2015年试题的视频解析则更为详尽,通常由经验丰富的讲师或行业专家讲解,他们会逐一剖析每一道题目,解释解题思路,指出常见错误,帮助考生理解并掌握解题技巧。 在准备软件设计师考试的过程中,以下几个关键知识点...

    程序设计实用案例选讲袁卫华案例选讲第十一周课.ppt

    【程序设计实用案例选讲】涉及的知识点主要围绕Java编程中的多线程应用和图形界面编程。以下是对这些主题的详细解析: 一、多线程应用 1. GUI线程: 在Java中,图形用户界面(GUI)由AWT和Swing库提供支持。在运行...

    JAVA开发工程师试题J801B

    10. **设计模式**:试题可能涉及单例、工厂、观察者等常见设计模式的实现和应用场景。 11. **Java 8及以上的新特性**:例如lambda表达式、函数式接口、Stream API和日期时间API等。 每一道题目都可能伴随着详细的...

    中级软件设计师2018上半年试题及答案解析

    6. **操作系统基础**:进程与线程的概念、内存管理、文件系统、I/O操作等,这些是操作系统课程的基础知识,可能会出现在试题中。 7. **网络基础**:TCP/IP协议栈、HTTP协议、网络安全、网络编程等,这些网络基础...

    244道scjp试题及答案

    SCJP,全称为Sun Certified Programmer for the Java 2 Platform Standard Edition,是由Oracle公司(原Sun Microsystems)...每一道题都应深入理解其背后的原理,而不仅仅是记住答案,这样才能在实际编程中灵活运用。

    2013上半年软考中级软件设计师试题及答案解析.zip

    答案解析部分会详细解释每一道试题的正确答案,帮助考生理解错误之处,强化正确知识点,提高解题技巧。通过这些试题和解析,考生可以检验自己的知识掌握程度,查漏补缺,为考试做好充分准备。 在复习过程中,考生...

    Java考试模拟试题及答案(上机2套题及答案)

    答案文档通常会详细解释每一道题目的解题过程和关键知识点,有助于深化理解并巩固学习成果。 在备考Java考试的过程中,考生应该注重以下几个方面: 1. **基础语法**:理解并熟练运用Java的基本语法,包括数据类型...

    2010年下半年软考软件设计师考试试题.rar

    考生在研读试题时,不仅要关注答案,更要深入理解每一道题背后所涵盖的知识点,以此来提高自身的理论素养和实战能力。 总的来说,软考软件设计师考试是对软件设计人员综合能力的一次全面检验,它要求考生具备深厚的...

    JAVA认证考试模拟试题

    6. **多线程**:掌握Thread类的使用,理解同步机制,如synchronized关键字、wait()、notify()方法,以及线程池的概念。 7. **反射API**:学习如何在运行时获取类的信息,动态调用方法,创建对象,以及修改类的属性...

    蓝桥杯模拟试题java_和C(本科)

    `Vector`是一种线程安全的动态数组,适用于多线程环境下的数据操作。`remove`方法用于移除并返回指定位置的元素,确保每次抽取的中奖者不会重复。 ### 2. 进制转换 此题涉及将三进制数字转换为十进制的问题,这是...

    2014年海康嵌入式笔试部分试题

    2014年海康嵌入式笔试部分试题 一、模态窗口与非模态窗口 在计算机科学中,模态窗口(Modal Window)和非模态窗口(Non-Modal Window)是两种不同的窗口类型。模态窗口是指在显示该窗口时,其他所有窗口都将被禁用...

    2019上半年软考中级软件设计师试题及答案解析.zip

    答案解析部分是此压缩包的核心价值,它详细解释了每一道题目的正确答案和解题思路。对于选择题,解析会指出每个选项的正确与否,并给出原因;对于填空题和简答题,不仅会给出标准答案,还会阐述背后的理论依据,帮助...

    2021-2022计算机二级等级考试试题及答案No.1907.docx

    这是一道考察基础知识的选择题,旨在测试考生对Visual FoxPro命令的记忆和理解。 - **应用场景**:在实际项目中,打开数据库通常是开发流程的第一步,以便后续进行数据的查询、更新等操作。 #### 排序算法的性能...

    java 文档资料

    另一道题目可能涉及到线程同步,需要使用`synchronized`关键字或wait/notify机制来解决并发问题。 在学习Java时,掌握基本语法是至关重要的,这包括变量、常量、运算符、控制结构(如if语句和循环)、方法定义和...

    2018年研究生全国统考计算机试题-操作系统部分试题解析

    ### 2018年研究生全国统考计算机试题-操作系统部分试题解析 #### 单项选择题解析 **23. 下列关于多任务操作系统的叙述中,正确的是____。** - **Ⅰ.具有并发和并行的特点** - **Ⅱ.需要实现对共享资源的保护** ...

    2021-2022计算机二级等级考试试题及答案No.15586.docx

    1. 题目提到的合法声明:这是一道关于C语言声明合法性的题目。选项B "a(5);" 是合法的,它代表一个长度为5的数组声明,而其他选项不符合C语言的语法。 2. Word滚动条按钮:在Word中,单击垂直滚动条的"↓"按钮,...

Global site tag (gtag.js) - Google Analytics