`

一道网上流传的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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics