逛论坛的看到一个疑似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...
经过分析线程1,2,3,4和文件A,B,C,D的规律,可以发现:对于文件A,如果有这样一个计数器Count,当Count%4 = 1的时候,线程1可以写入1,当Count%4 = 2的时候,线程2可以写入2,当Count%4 = 3的时候,线程3可以写入3,当Count%4 = 0的时候,线程4可以写入4。对于文件B,C,D亦如此。则可以得出以下代码:
public class GoogleInterview {
//这个index决定当前那个线程可以写文件,每往文件里写一个数字,该数字则自增1.
private static volatile int index_A = 1;
private static volatile int index_B = 1;
private static volatile int index_C = 1;
private static volatile int index_D = 1;
private static final int NUM = 4;
private static String[] fileNames = {"A", "B", "C", "D"} ;
private static BufferedWriter[] writers = new BufferedWriter[4];
static
{
for(int i = 0; i < NUM; i++)
{
try {
writers[i] = new BufferedWriter(new FileWriter(new File("D:"+File.separator+fileNames[i]+".txt"), true));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
static class WriterThread1 extends Thread
{
private static final int file_a = 1;
private static final int file_b = 0;
private static final int file_c = 3;
private static final int file_d = 2;
private static final String content = "1";
public void run()
{
while(true)
{
writeFiles(file_a,file_b,file_c,file_d, content);
}
}
}
static class WriterThread2 extends Thread
{
private static final int file_a = 2;
private static final int file_b = 1;
private static final int file_c = 0;
private static final int file_d = 3;
private static final String content = "2";
public void run()
{
while(true)
{
writeFiles(file_a,file_b,file_c,file_d, content);
}
}
}
static class WriterThread3 extends Thread
{
private static final int file_a = 3;
private static final int file_b = 2;
private static final int file_c = 1;
private static final int file_d = 0;
private static final String content = "3";
public void run()
{
while(true)
{
writeFiles(file_a,file_b,file_c,file_d, content);
}
}
}
static class WriterThread4 extends Thread
{
private static final int file_a = 0;
private static final int file_b = 3;
private static final int file_c = 2;
private static final int file_d = 1;
private static final String content = "4";
public void run()
{
while(true)
{
writeFiles(file_a,file_b,file_c,file_d, content);
}
}
}
static void flush()
{
try {
writers[0].flush();
writers[1].flush();
writers[2].flush();
writers[3].flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
static void writeFiles(int a, int b, int c, int d, String content)
{
if(index_A%4 == a)
{
try {
writers[0].write(content);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
index_A++;
flush();
}
if(index_B%4 == b)
{
try {
writers[1].write(content);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
index_B++;
flush();
}
if(index_C%4 == c)
{
try {
writers[2].write(content);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
index_C++;
flush();
}
if(index_D%4 == d)
{
try {
writers[3].write(content);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
index_D++;
flush();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
WriterThread1 wt1 = new WriterThread1();
WriterThread2 wt2 = new WriterThread2();
WriterThread3 wt3 = new WriterThread3();
WriterThread4 wt4 = new WriterThread4();
wt1.start();
wt2.start();
wt3.start();
wt4.start();
}
}
PS:写完后总感觉怪怪的。。。好像我这个实现有点取巧。。。和题目的意思有点不一致。。。
分享到:
相关推荐
多线程面试题
2022java面试题、JVM面试题、多线程面试题、并发编程、Redis面试题、MySQL面试题、Java2022面试题、Netty面试题、Elasticsearch面试题、Tomcat面试题、Dubbo面试题、Kafka面试题、Linux面试题、2021面试题、java面试...
java经典多线程面试题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等
面试题和答案. 有多线程, 数据库,框架题目等知识点
iOS多线程面试题
多线程&并发面试题 JVM面试题 Mysql面试题 Redis面试题 Memcached面试题 MongoDB面试题 Spring面试题 Spring Boot面试题 Spring Cloud面试题 RabbitMQ面试题 Dubbo 面试题 MyBatis 面试题 ZooKeeper 面试题 数据结构...
这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会...
java多线程面试经典,内含50道常被面试官问到的java多线程题。
多线程,多线程面试题,C#源码.zip
java面试题之多线程.pdf
Java多线程面试题,作为多线程面试题,非常经典。
面试题c++mysql多线程操作系统 面试题c++mysql多线程操作系统 面试题c++mysql多线程操作系统 面试题c++mysql多线程操作系统 面试题c++mysql多线程操作系统
15个顶级Java多线程面试题答案
史上最全 Java 多线程面试题及答案.docx
java面试题_多线程(68题)
【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多线程面试题【BAT必备】多...
1. 什么是线程? 2. 什么是线程安全和线程不安全? 3. 什么是⾃旋锁? 4. 什么是CAS? 5. 什么是乐观锁和悲观锁? 6. 什么是AQS? 7. 什么是原⼦操作?在Java Concurrency API中有哪些原⼦类(atomic classes)? 8. ...
java大厂的多线程面试题,涵盖了基础和进阶的多线程的理论和实际的应用,供各位下载使用。多线程面试题
Java线程面试题Top50[参照].pdf