有四个线程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. Android各种颜色dawable.xml中定义

    < drawable name="white">#FFFFFF< /drawable>< !--白 --> < drawable name ...

  2. jboss学习 - vfs---转载

    jboss的VFS是为了解决什么问题,他为什么有用呢 在jboss中有很多类似的资源操作的代码都分散在程序的各个地方,大多数情况下代码首先确定操作的资源的类型,比如是文件或者是文件夹,通过URL加载的 ...

  3. redis 本机链接服务端命令

    在windows 本机链接服务端redis,需要下载windows 端的redis: 1,运行redis-server.exe程序:2,打开cmd 控制台3,执行命令 D:\redis64\redis ...

  4. Android AIDL图解

      代码来自:http://www.cnblogs.com/mandroid/archive/2011/02/26/1965428.html     (XXX.AIDL自动生成的IXXX.java类中 ...

  5. select 响应时间 js

    HTML form select表单标签案例代码如下: 跳转菜单的需要放在head头部标签内的JS脚本代码:<script type="text/javascript"> ...

  6. tortoisegit 保存用户名密码

    方法一当你配置好git后,在C:\Documents and Settings\Administrator\ 目录下有一个 .gitconfig 的文件,里面会有你先前配好的name 和email,只 ...

  7. 你确定你是一个合格的.Net开发人员吗?

    做.net开发已有近5年时间,自认掌握的知识比较全面.最近部门需要招人,今天抽空在网上看了一下,发现我了解的还是不够多啊.下面是我大致的罗列了一下作为一名.Net开发人员所需要掌握的只是.看看你是不是 ...

  8. FTP链接mac

    mac下一般用smb服务来进行远程文件访问,但要用FTP的话,高版本的mac os默认关掉了,可以用如下命令打开: sudo -s launchctl load -w /System/Library/ ...

  9. GUI树组件,表格

    树组件首先要new一个JTree,再加结点,然后添加到 JScrollPane JTree tree1=new JTree(); //.......添加节点 add(new ScrollPane(tr ...

  10. 不用修改nginx的高并发合并回源架构

    nginx的连接都是一对一的,想改成一对多,比较麻烦,所以曾经看完了Nginx代码想改成一对多,我还是没改成,后来改变了一下思路想到一个更简单的方案,而且不失并发性能,还容易控制,下面先给出下面的图: ...