`
MouseLearnJava
  • 浏览: 458951 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

三道多线程编程题

阅读更多
本文记录三道多线程编程题。

第一道:
有四个线程1、2、3、4。线程1的功能就是输出A线程2的功能就是输出B,以此类推......... 现在有四个文件file1,file2,file3, file4。初始都为空。
现要让四个文件呈如下格式:
file1:A B C D A B....
file2:B C D A B C....
file3:C D A B C D....
file4:D A B C D A....

程序如下:
package my.test;

import java.io.FileWriter;
import java.io.IOException;

public class FileWriteUtil {

	private int currentThreadNum = 1;

	/** 记录将字符写入文件的次数 */
	private int count = 0;
	
	private int currentFileNum = 1;
	
	public void write(char value, int threadNum) {
		
		
		generateNextFileNum();
		
		FileWriter writer = null;
		try {
			writer = new FileWriter("file" + currentFileNum + ".txt", true);
			writer.write(String.valueOf(value));
			System.out.printf(
					"ThreadNum=%d is executing. %c is written into file file%d.txt \n",
					currentThreadNum, value, currentFileNum);
			writer.flush();
			count++;
			currentThreadNum = threadNum;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		if (null != writer) {
			try {
				writer.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				writer = null;
			}
		}

		generateNextThreadNum();
		
	}

	public int getCurrentThreadNum() {
		return currentThreadNum;
	}

	public void setCurrentThreadNum(int currentThreadNum) {
		this.currentThreadNum = currentThreadNum;
	}
	
	private void generateNextFileNum()
	{
		if (count % 4 == 0) {
			currentFileNum = 1;
		}else
		{
			currentFileNum++;
		}
	}

	private void generateNextThreadNum() {

		if (count % 4 == 0) {
			if (currentThreadNum < 3) {
				currentThreadNum += 2;
			} else {
				currentThreadNum = (currentThreadNum + 2) % 4;
			}
		}else
		{
			if(currentThreadNum == 4)
			{
				currentThreadNum=1;
			}else
			{
				currentThreadNum++;
			}
		}
	}

}


package my.test;

public class WriteRunnable implements Runnable {

	private FileWriteUtil util = null;

	private int threadNum = 1;

	private char value = ' ';

	/**
	 * @param util
	 */
	public WriteRunnable(FileWriteUtil util, int threadNum, char value) {
		super();
		this.util = util;
		this.threadNum = threadNum;
		this.value = value;
	}

	public void run() {
		/**
		 * 假设循环16次, 一直循环可以使用while(true) 或者 for(;;)
		 */
		for (int i = 0; i < 16; i++) {
			synchronized (util) {
				while (threadNum != util.getCurrentThreadNum()) {
					try {
						util.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

				util.write(value, threadNum);
				
				util.notifyAll();

			}
		}

	}

}


package my.test;  
  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
  
/** 
 * 有四个线程1、2、3、4。
 * 
 * 线程1的功能就是输出A,线程2的功能就是输出B,
 * 
 * 以此类推......... 现在有四个文件file1, 
 * file2,file3, file4。初始都为空。现要让四个文件呈如下格式: 
 * file1:A B C D A B.... 
 * file2:B C D A B C.... 
 * file3:C D A B C D.... 
 * file4:D A B C D A.... 
 * 
 * @author Eric 
 * 
 */  
public class Main {  
      
    public static void main(String[] args) {  
        FileWriteUtil util = new FileWriteUtil();  
          
  
        ExecutorService service = Executors.newCachedThreadPool();  
  
        service.execute(new WriteRunnable(util, 1, 'A'));  
        service.execute(new WriteRunnable(util, 2, 'B'));  
        service.execute(new WriteRunnable(util, 3, 'C'));  
        service.execute(new WriteRunnable(util, 4, 'D'));  
  
        service.shutdown();  
          
    }  
  
}  


程序运行结果:
控制台输出--->
ThreadNum=1 is executing. A is written into file file1.txt
ThreadNum=2 is executing. B is written into file file2.txt
ThreadNum=3 is executing. C is written into file file3.txt
ThreadNum=4 is executing. D is written into file file4.txt
ThreadNum=2 is executing. B is written into file file1.txt
ThreadNum=3 is executing. C is written into file file2.txt
ThreadNum=4 is executing. D is written into file file3.txt
ThreadNum=1 is executing. A is written into file file4.txt
ThreadNum=3 is executing. C is written into file file1.txt
ThreadNum=4 is executing. D is written into file file2.txt
ThreadNum=1 is executing. A is written into file file3.txt
ThreadNum=2 is executing. B is written into file file4.txt
ThreadNum=4 is executing. D is written into file file1.txt
ThreadNum=1 is executing. A is written into file file2.txt
ThreadNum=2 is executing. B is written into file file3.txt
ThreadNum=3 is executing. C is written into file file4.txt
ThreadNum=1 is executing. A is written into file file1.txt
ThreadNum=2 is executing. B is written into file file2.txt
ThreadNum=3 is executing. C is written into file file3.txt
ThreadNum=4 is executing. D is written into file file4.txt
ThreadNum=2 is executing. B is written into file file1.txt
ThreadNum=3 is executing. C is written into file file2.txt
ThreadNum=4 is executing. D is written into file file3.txt
ThreadNum=1 is executing. A is written into file file4.txt
ThreadNum=3 is executing. C is written into file file1.txt
ThreadNum=4 is executing. D is written into file file2.txt
ThreadNum=1 is executing. A is written into file file3.txt
ThreadNum=2 is executing. B is written into file file4.txt
ThreadNum=4 is executing. D is written into file file1.txt
ThreadNum=1 is executing. A is written into file file2.txt
ThreadNum=2 is executing. B is written into file file3.txt
ThreadNum=3 is executing. C is written into file file4.txt
ThreadNum=1 is executing. A is written into file file1.txt
ThreadNum=2 is executing. B is written into file file2.txt
ThreadNum=3 is executing. C is written into file file3.txt
ThreadNum=4 is executing. D is written into file file4.txt
ThreadNum=2 is executing. B is written into file file1.txt
ThreadNum=3 is executing. C is written into file file2.txt
ThreadNum=4 is executing. D is written into file file3.txt
ThreadNum=1 is executing. A is written into file file4.txt
ThreadNum=3 is executing. C is written into file file1.txt
ThreadNum=4 is executing. D is written into file file2.txt
ThreadNum=1 is executing. A is written into file file3.txt
ThreadNum=2 is executing. B is written into file file4.txt
ThreadNum=4 is executing. D is written into file file1.txt
ThreadNum=1 is executing. A is written into file file2.txt
ThreadNum=2 is executing. B is written into file file3.txt
ThreadNum=3 is executing. C is written into file file4.txt
ThreadNum=1 is executing. A is written into file file1.txt
ThreadNum=2 is executing. B is written into file file2.txt
ThreadNum=3 is executing. C is written into file file3.txt
ThreadNum=4 is executing. D is written into file file4.txt
ThreadNum=2 is executing. B is written into file file1.txt
ThreadNum=3 is executing. C is written into file file2.txt
ThreadNum=4 is executing. D is written into file file3.txt
ThreadNum=1 is executing. A is written into file file4.txt
ThreadNum=3 is executing. C is written into file file1.txt
ThreadNum=4 is executing. D is written into file file2.txt
ThreadNum=1 is executing. A is written into file file3.txt
ThreadNum=2 is executing. B is written into file file4.txt
ThreadNum=4 is executing. D is written into file file1.txt
ThreadNum=1 is executing. A is written into file file2.txt
ThreadNum=2 is executing. B is written into file file3.txt
ThreadNum=3 is executing. C is written into file file4.txt


file1文件中的内容-->
ABCDABCDABCDABCD

file2文件中的内容:-->
BCDABCDABCDABCDA

file3文件中的内容:-->
CDABCDABCDABCDAB

file4文件中的内容:-->
DABCDABCDABCDABC

第二道:
一个线程打印 1~52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。
http://mouselearnjava.iteye.com/blog/1949693



第三道


有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次ABCABC…

http://mouselearnjava.iteye.com/blog/1949228
2
2
分享到:
评论
4 楼 MouseLearnJava 2013-10-16  
dujiayi001 写道
弱弱的问一句,我跑了你的代码,但是出来结果是:
pool-1-thread-1 : A.txt=>A
pool-1-thread-2 : B.txt=>B
pool-1-thread-3 : C.txt=>C
pool-1-thread-4 : D.txt=>D
pool-1-thread-1 : A.txt=>B
pool-1-thread-2 : B.txt=>C
pool-1-thread-3 : C.txt=>D
pool-1-thread-4 : D.txt=>A
pool-1-thread-1 : A.txt=>C
pool-1-thread-2 : B.txt=>D
pool-1-thread-3 : C.txt=>A
pool-1-thread-4 : D.txt=>B

跟题目问的好像不对劲,题目要求是线程1的功能就是输出A,线程2的功能就是输出B,而你的结果是线程1只输出A文件


谢谢你的指正,确实跑题了。

程序已经修正。

一个运行结果如下:
ThreadNum=1 is executing. A is written into file file1.txt
ThreadNum=2 is executing. B is written into file file2.txt
ThreadNum=3 is executing. C is written into file file3.txt
ThreadNum=4 is executing. D is written into file file4.txt
ThreadNum=2 is executing. B is written into file file1.txt
ThreadNum=3 is executing. C is written into file file2.txt
ThreadNum=4 is executing. D is written into file file3.txt
ThreadNum=1 is executing. A is written into file file4.txt
ThreadNum=3 is executing. C is written into file file1.txt
ThreadNum=4 is executing. D is written into file file2.txt
ThreadNum=1 is executing. A is written into file file3.txt
ThreadNum=2 is executing. B is written into file file4.txt
ThreadNum=4 is executing. D is written into file file1.txt
ThreadNum=1 is executing. A is written into file file2.txt
ThreadNum=2 is executing. B is written into file file3.txt
ThreadNum=3 is executing. C is written into file file4.txt
ThreadNum=1 is executing. A is written into file file1.txt
ThreadNum=2 is executing. B is written into file file2.txt
ThreadNum=3 is executing. C is written into file file3.txt
ThreadNum=4 is executing. D is written into file file4.txt
ThreadNum=2 is executing. B is written into file file1.txt
ThreadNum=3 is executing. C is written into file file2.txt
ThreadNum=4 is executing. D is written into file file3.txt
ThreadNum=1 is executing. A is written into file file4.txt
ThreadNum=3 is executing. C is written into file file1.txt
ThreadNum=4 is executing. D is written into file file2.txt
ThreadNum=1 is executing. A is written into file file3.txt
ThreadNum=2 is executing. B is written into file file4.txt
ThreadNum=4 is executing. D is written into file file1.txt
ThreadNum=1 is executing. A is written into file file2.txt
ThreadNum=2 is executing. B is written into file file3.txt
ThreadNum=3 is executing. C is written into file file4.txt
ThreadNum=1 is executing. A is written into file file1.txt
ThreadNum=2 is executing. B is written into file file2.txt
ThreadNum=3 is executing. C is written into file file3.txt
ThreadNum=4 is executing. D is written into file file4.txt
ThreadNum=2 is executing. B is written into file file1.txt
ThreadNum=3 is executing. C is written into file file2.txt
ThreadNum=4 is executing. D is written into file file3.txt
ThreadNum=1 is executing. A is written into file file4.txt
ThreadNum=3 is executing. C is written into file file1.txt
ThreadNum=4 is executing. D is written into file file2.txt
ThreadNum=1 is executing. A is written into file file3.txt
ThreadNum=2 is executing. B is written into file file4.txt
ThreadNum=4 is executing. D is written into file file1.txt
ThreadNum=1 is executing. A is written into file file2.txt
ThreadNum=2 is executing. B is written into file file3.txt
ThreadNum=3 is executing. C is written into file file4.txt
ThreadNum=1 is executing. A is written into file file1.txt
ThreadNum=2 is executing. B is written into file file2.txt
ThreadNum=3 is executing. C is written into file file3.txt
ThreadNum=4 is executing. D is written into file file4.txt
ThreadNum=2 is executing. B is written into file file1.txt
ThreadNum=3 is executing. C is written into file file2.txt
ThreadNum=4 is executing. D is written into file file3.txt
ThreadNum=1 is executing. A is written into file file4.txt
ThreadNum=3 is executing. C is written into file file1.txt
ThreadNum=4 is executing. D is written into file file2.txt
ThreadNum=1 is executing. A is written into file file3.txt
ThreadNum=2 is executing. B is written into file file4.txt
ThreadNum=4 is executing. D is written into file file1.txt
ThreadNum=1 is executing. A is written into file file2.txt
ThreadNum=2 is executing. B is written into file file3.txt
ThreadNum=3 is executing. C is written into file file4.txt
3 楼 dujiayi001 2013-10-15  
弱弱的问一句,我跑了你的代码,但是出来结果是:
pool-1-thread-1 : A.txt=>A
pool-1-thread-2 : B.txt=>B
pool-1-thread-3 : C.txt=>C
pool-1-thread-4 : D.txt=>D
pool-1-thread-1 : A.txt=>B
pool-1-thread-2 : B.txt=>C
pool-1-thread-3 : C.txt=>D
pool-1-thread-4 : D.txt=>A
pool-1-thread-1 : A.txt=>C
pool-1-thread-2 : B.txt=>D
pool-1-thread-3 : C.txt=>A
pool-1-thread-4 : D.txt=>B

跟题目问的好像不对劲,题目要求是线程1的功能就是输出A,线程2的功能就是输出B,而你的结果是线程1只输出A文件
2 楼 MouseLearnJava 2013-10-14  
cywhoyi 写道
挺好练习,第一题我采用的是
	
        private static Semaphore A = new Semaphore(1);
	private static Semaphore B = new Semaphore(1);
	private static Semaphore C = new Semaphore(1);
	private static Semaphore D = new Semaphore(1);
	private static AtomicInteger value = new AtomicInteger(1);

信号量+原子类的操作,感觉比LZ更为简洁,顶下面试而用


是的。JDK 1.5 之后的J.U.C 包对多线程编程是个很不撮的选择,方便很多。
1 楼 cywhoyi 2013-10-14  
挺好练习,第一题我采用的是
	
        private static Semaphore A = new Semaphore(1);
	private static Semaphore B = new Semaphore(1);
	private static Semaphore C = new Semaphore(1);
	private static Semaphore D = new Semaphore(1);
	private static AtomicInteger value = new AtomicInteger(1);

信号量+原子类的操作,感觉比LZ更为简洁,顶下面试而用

相关推荐

Global site tag (gtag.js) - Google Analytics