三道多线程编程题本文记录三道多线程编程题。第一道: 有四个线程1、2、3、4。线程1的功能就是输出A,线程2的功能
三道多线程编程题
本文记录三道多线程编程题。
第一道:
有四个线程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 blocke.printStackTrace();}if (null != writer) {try {writer.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.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文件中的内容-->ABCDABCDABCDABCDfile2文件中的内容:-->BCDABCDABCDABCDAfile3文件中的内容:-->CDABCDABCDABCDABfile4文件中的内容:-->DABCDABCDABCDABC第二道:一个线程打印 1~52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。
http://mouselearnjava.iteye.com/blog/1949693
第三道有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次ABCABC…
http://mouselearnjava.iteye.com/blog/1949228 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更为简洁,顶下面试而用 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 包对多线程编程是个很不撮的选择,方便很多。 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文件 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