有四个线程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不自动弹出虚拟键盘

    如果是Activity的话 在 Manifest.xml 相应的 Activity 里添加 android:windowSoftInputMode="adjustPan|stateHidde ...

  2. 不相交集python实现

    1.不相交集是解决等价关系的一种数据结构,执行合并和查找的速度都很快,M次执行合并和查找的执行时间为(M*logN). 在一个集合中.对于每一对元素(a,b),a,b∈S,对于关系R假设满足以下三个条 ...

  3. SuperSocket快速入门(三):实现你的AppServer和AppSession

    什么是AppSession? AppSession 代表一个和客户端的逻辑连接,基于连接的操作应该定义于在该类之中.你可以用该类的实例发送数据到客户端,接收客户端发送的数据或者关闭连接.同时可以保存客 ...

  4. The requested page cannot be accessed because the related configuration data for the page is invalid

    当在VS2013下开发web site时,调试时都是在IIS Express中进行的,没有问题.当部署到IIS中,出现:The requested page cannot be accessed be ...

  5. 连接、关联、JOIN、APPLY(SQL Server)

    连接方式 连接类型 个人总结 阐述(生成两个集合的约束笛卡儿积) INNER    JOIN 内连接 关联相同的(用于查找关联的信息) FROM C AS c INNER JOIN D AS d ON ...

  6. colorful-记录好看的颜色

    p { float: left; width: 100px; height: 100px; border: 1px solid black; margin: 5px; text-align: cent ...

  7. Entity Framework 的枚举类型

    新增数据模型,新增“实体”之后,新增“枚举类型”,创建Enum值,将“实体”中的列和Enum关联,选中“实体”中的列属性改变类型为Enum名称,生成数据库…… 如下转自:http://item.con ...

  8. angularjs使用directive实现倒计时按钮

    前不久在做一个彩票的项目时,有一个手动开奖的需求.所以有了这个倒计时按钮.下面分享下具体的代码: 效果: 代码: App.directive('timerBtn', function() { // 倒 ...

  9. 武汉科技大学ACM :1007: A+B for Input-Output Practice (VII)

    Problem Description Your task is to Calculate a + b. Input The input will consist of a series of pai ...

  10. Java学习笔记(1):注释规范

    注释规范 1.   类注释 在每个类前面必须加上类注释,注释模板如下: 2.   属性注释 在每个属性前面必须加上属性注释,注释模板如下: 3.   方法注释 在每个方法前面必须加上方法注释,注释模板 ...