`

一道网上流传的Google的多线程面试题的Java实现

阅读更多

逛论坛的看到一个疑似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:写完后总感觉怪怪的。。。好像我这个实现有点取巧。。。和题目的意思有点不一致。。。

 

1
2
分享到:
评论

相关推荐

    Java面试题-各大公司

    这些公司,如腾讯、微软、神州、亚信、惠普、巨人网络、联想、华为、阿里巴巴、IBM和Google,都是全球IT行业的巨头,他们在招聘Java开发人员时会设置一系列专业且深入的面试题,以评估候选人的技能和知识深度。...

    很多大牛公司的面试题

    5. **多线程**:Java提供了内置的并发工具,如Thread、Runnable、ExecutorService等。面试中可能会要求编写线程安全的代码,或者讨论同步机制,如synchronized关键字和Lock接口。 6. **设计模式**:面试题常常涉及...

    Java中文文档以及Java面试宝典

    它可能涵盖了Java基础、高级特性、设计模式、数据结构与算法、多线程、JVM内存管理、框架知识、数据库、网络、并发编程、Spring Boot、微服务等多个方面的面试题和解答。这份宝典不仅有助于求职者准备面试,也对在职...

    百度Java面试题 前200页精选(下)

    在编程语言方面,Java和C++都是流行的编程语言,它们在异常处理机制上有不同的实现和应用。Java 9带来了许多新功能,如模块化系统、新的JShell工具等。而Tomcat作为JavaWeb应用服务器,有其特定的结构和类加载器流程...

    史上最全大厂java岗位面试题-进BAT公司必备资料.zip

    这份“史上最全大厂Java岗位面试题-进BAT公司必备资料.zip”压缩包包含了这些公司可能问到的面试问题,以及对这些问题的解答和总结,帮助求职者做好充分准备。 首先,Java基础是面试的基石。面试官通常会考察候选人...

    JAVA面试资料大集合

    "java面试题总汇《很经典的》.rar"则可能包含了历年来的经典面试题目,这些题目可能涵盖了更广泛的领域,比如Spring框架的应用、数据库连接池的管理、微服务架构的理解、大数据处理中的Java应用,甚至可能涉及到一些...

    面试题和学习资料整合

    学习Android需要理解Activity生命周期、Intent机制、布局管理、多线程处理、数据存储(SQLite、SharedPreferences)以及Google提供的各种服务和API,如Google Maps、Firebase等。 3. **GIS MapView**:GIS(地理...

    嵌入式面试题文档

    ### 嵌入式开发面试题知识点解析 #### 一、选择题知识点解析 1. **手机操作系统**: - **macOS**:不属于手机操作系统。macOS是苹果公司为Mac电脑开发的操作系统。 - **Palm OS**:早期的移动设备操作系统,由...

    android面试题

    在Android面试过程中,面试官通常会考察候选人的技术深度、项目经验、问题解决能力...此外,阅读张孝祥整理的Java就业面试题大全,可以扩展对Java基础和面向对象设计的理解,这对成为一名全面的Android开发者至关重要。

    就业Java冲刺提升.7z

    理解线程安全、死锁和活锁的概念,以及如何使用并发工具来优化多线程程序,是高级Java开发者必备技能。 4. **IO/NIO/BIO**:理解Java的输入输出流模型,包括字符流和字节流,以及缓冲流、转换流等。NIO(非阻塞I/O...

    java-summary-of-the-interview-.rar_Java编程_Java_

    这份"java-summary-of-the-interview-.rar"压缩包显然包含了关于Java编程的基础知识和面试题,旨在帮助开发者和求职者深入理解Java的核心概念并准备面试。 首先,Java基础知识涵盖了以下几个关键部分: 1. **Java...

    求职与招聘.zip

    - **多线程**:理解AsyncTask、Handler、Thread和Service,以及使用现代库如Coroutines处理异步任务。 - **Android Studio**:集成开发环境(IDE)提供了丰富的工具,如调试器、性能分析器等,加速开发进程。 - *...

Global site tag (gtag.js) - Google Analytics