有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:

A:1 2 3 4 1 2....

B:2 3 4 1 2 3....

C:3 4 1 2 3 4....

D:4 1 2 3 4 1....

请设计程序。

我的思路是这样的:

1、首先每个线程都只负责像一个文件句柄写入自己的id号,至于是向谁写,需要传参的,长得像这样:private void write(BufferedWriter bw)

2、四个线程有一个公用锁lock,拿到锁的线程才能运行上述的write方法,每次都会从一个文件句柄List中取一个句柄出来,向其中写入id,每次都是取List.get(this.id)这个句柄

3、句柄List每四次后移一次,第一轮句柄顺序为[A B C D],第二轮就是[D A B C],这样每一轮线程取到的都是不一样的句柄

4、什么是一轮:四个线程分别都向文件写入过内容,就是一轮,用now参数表示,now%4==0说明一轮结束,需要后移句柄

5、定义一个flag为二进制的0000,第一个线程写入完毕就将最后一位置1,第二个线程写入完毕就将倒数第二位置1,以此类推,直到所有位置都被置为1,flags变为二进制1111,

每次线程会判断,如果我的标志位置成了1,就不写入了

以下是我的实现:

public class InTurnWriteThread implements Runnable{

public static LinkedList<BufferedWriter> bwList = new LinkedList<BufferedWriter>();

// private static int[] flags = new int[]{0,0,0,0};

private static int flags2 = 0;

static{

try {

BufferedWriter bwa = new BufferedWriter(new FileWriter("F:/A.txt"));

BufferedWriter bwb = new BufferedWriter(new FileWriter("F:/B.txt"));

BufferedWriter bwc = new BufferedWriter(new FileWriter("F:/C.txt"));

BufferedWriter bwd = new BufferedWriter(new FileWriter("F:/D.txt"));

bwList.addLast(bwa);

bwList.addLast(bwb);

bwList.addLast(bwc);

bwList.addLast(bwd);

} catch (Exception e) {

e.printStackTrace();

}

}

private static int now = 0;

private final static String lock = "lock";

private int id;

public InTurnWriteThread(int id) {

this.id = id;

}

@Override

public void run() {

int i = 8;

while(i>0){

synchronized (lock) {

// if(flags[this.id-1]==0){

if( (flags2 | (1<<(this.id-1)) ) > flags2){

this.write(bwList.get(this.id-1));

// flags[this.id-1]=1;

flags2 = flags2|(1<<(this.id-1));

++now;

--i;

}

if(now%4 == 0){

BufferedWriter tmp = bwList.removeLast();

bwList.addFirst(tmp);

// flags = new int[]{0,0,0,0};

flags2 = 0;

}

}

}

}

private void write(BufferedWriter bw){

try {

bw.write(id+" ");

bw.flush();

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

Thread t1 = new Thread(new InTurnWriteThread(1));

Thread t2 = new Thread(new InTurnWriteThread(2));

Thread t3 = new Thread(new InTurnWriteThread(3));

Thread t4 = new Thread(new InTurnWriteThread(4));

t1.start();

t2.start();

t3.start();

t4.start();

}

}

多线程面试题(Google)的更多相关文章

  1. java并发与多线程面试题与问题集合

    http://www.importnew.com/12773.html     https://blog.csdn.net/u011163372/article/details/73995897    ...

  2. 15个顶级Java多线程面试题及回答

    Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程 的问题.在投资银行业务中多线程和并发 ...

  3. 【java】:多线程面试题

    经常面试的时候,让写各种乱七八糟的多线程面试题,收集了很多,有些还是挺好玩的. 1.编写程序实现,子线程循环10次,接着主线程循环20次,接着再子线程循环10次,主线程循环20次,如此反复,循环50次 ...

  4. 【OD深入学习】Java多线程面试题

    一.参考文章 1. Java线程面试题 Top 50 2. Java面试——多线程面试题 3. JAVA多线程和并发基础面试问答 4. 15个顶级Java多线程面试题及回答 二.逐个解答 三.一语中的 ...

  5. Java面试——多线程面试题总结

    )两者都在等待对方所持有但是双方都不释放的锁,这时便会一直阻塞形成死锁. //存放两个资源等待被使用 public class Resource { public static Object obj1 ...

  6. 40道经典java多线程面试题

    40道经典java多线程面试题 题目来源 看完了java并发编程的艺术,自认为多线程"大成",然后找了一些面试题,也发现了一些不足. 一下问题来源于网上的博客,答案均为本人个人见解 ...

  7. 一线大厂面试官最喜欢问的15道Java多线程面试题

    前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者 ...

  8. java多线程面试题选择题大全含答案

    v java多线程面试题选择题大全含答案 java多线程面试题选择题大全含答案 1.下面程序的运行结果()(选择一项)public static void main(String[] args) {T ...

  9. 程序员Java架构师多线程面试题和回答解析

    当我们在Java架构师面试的过程中常见的多线程和并发方面的问题肯定是必不可少的一部分.那么在面试之前我们更应该多准备一些关于多线程方面的问题. 面试官只是想确信面试者有足够的Java线程与并发方面的知 ...

  10. 「建议心心」要就来15道多线程面试题一次爽到底(1.1w字用心整理)

    . 本文是给**「建议收藏」200MB大厂面试文档,整理总结2020年最强面试题库「CoreJava篇」**写的答案,所有相关文章已经收录在码云仓库:https://gitee.com/bingqil ...

随机推荐

  1. POJ Farm Tour

    Farm Tour 题目: 约翰有N块地,家在1号,而N号是个仓库.农场内有M条道路(双向的),道路i连接这ai号地和bi号地,长度为ci. 约翰希望依照从家里出发,经过若干地后达到仓库.然后再返回家 ...

  2. Java – 4 Security Vulnerabilities Related Coding Practices to Avoid---reference

    This article represents top 4 security vulnerabilities related coding practice to avoid while you ar ...

  3. 人工智能2:智能Agent

    一.Agent基本定义 基于理性行为的Agent是本书人工智能方法的核心.Agent由传感器.执行器两个重要元件组成,具有与环境交互的能力,其能力是通过分析感知序列,经过Agent函数映射到相应的行动 ...

  4. X5SDK 腾讯浏览器内核

    介绍 官网:http://x5.tencent.com/ 文档:http://x5.tencent.com/doc?id=1003  腾讯浏览服务由QQ浏览器团队出品,致力于优化移动端[webview ...

  5. javascript !!的作用是把一个其他类型的变量转成的bool类型

    !!的作用是把一个其他类型的变量转成的bool类型

  6. python面对对象编程----2:__init__

    面对对象编程估计我们最早接触到的就是__init__了,也就是实例的初始化处理过程: 1:来看看最基础的__init__ class Card(object): #抽象类Card,并不用于实例化 de ...

  7. ant打包命令

    学习ant打包命令.发布到以上tomcat还未做集成部署,无法添加到jenkins中. http://blog.csdn.net/telnetor/article/details/7015935 ht ...

  8. php正则表达式总结

    <?php echo 'wj'; echo '<br>'; $file = '<td>移动150卡</td><!--<td></td& ...

  9. 几种常用的Java数据源解决方案

    http://blog.163.com/qqabc20082006@126/blog/static/22928525201041944847653/

  10. epoll 中EPOLLIN 和 EPOLLOUT

    epoll主要是事件回调运行的,我们使用socket的时候主要使用两个事件 EPOLLOUT事件:EPOLLOUT事件只有在连接时触发一次,表示可写,其他时候想要触发,那你要先准备好下面条件:1.某次 ...