多线程写文件问题解答
来源:互联网 发布:网络灯亮着但是没网络 编辑:程序博客网 时间:2024/05/17 04:52
问题 :
4个线程 线程1 打印A 线程2打印B 线程3打印C 线程4打印D 向文件1中写入ABCDABCDABCD... 向文件2写入BCDABCDA...... 向文件3写入CDABCDAB...... 向文件4写入DABCDABC......
解答源码:
package com.test.play;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Test {public static void main(String[] args) {final Task task = new Task();/** * 线程1,输出A */new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {task.outputA();}}}, "线程1,输出A").start();/** * 线程2,输出B */new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {task.outputB();}}}, "线程2,输出B").start();/** * 线程3,输出C */new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {task.outputC();}}}, "线程3,输出C").start();/** * 线程4,输出D */new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {task.outputD();}}}, "线程4,输出D").start();}public static class Task {private Lock lock = new ReentrantLock();private BufferedWriter bw1 = null;private BufferedWriter bw2 = null;private BufferedWriter bw3 = null;private BufferedWriter bw4 = null;// 用于控制每一轮输出,对于每一轮,每个线程都要分别向不同的文件中输入相应的内容private int ctl = 0;/** * 以下四个condition,用于控制四个线程的同步! */private Condition cond1 = lock.newCondition();private Condition cond2 = lock.newCondition();private Condition cond3 = lock.newCondition();private Condition cond4 = lock.newCondition();/** * 用于控制,每一轮必须所有的线程工作完毕后,才开始下一轮 */private boolean[] outputThisRound = { false, true, true, true };public Task() {try {// 可以将内容输出的bin目录中/*URL fileFolderPath = Test.class.getClassLoader().getResource("com/test/play");bw1 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileFolderPath.getFile() + "file1.txt")));bw2 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileFolderPath.getFile() + "file2.txt")));bw3 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileFolderPath.getFile() + "file3.txt")));bw4 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileFolderPath.getFile() + "file4.txt")));*/// 将内容输出到 D 盘 A B C D 四个文件中bw1 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("D:/A.txt"))));bw2 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("D:/B.txt"))));bw3 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("D:/C.txt"))));bw4 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("D:/D.txt"))));} catch (Exception e) {e.printStackTrace();}}public void outputA() {lock.lock();try {while(outputThisRound[0]) {System.out.println("outputA begin to await!");cond1.await();}if (ctl % 4 == 0) {bw1.write("A");bw1.flush();} else if (ctl % 4 == 1) {bw4.write("A");bw4.flush();} else if (ctl % 4 == 2) {bw3.write("A");bw3.flush();} else if (ctl % 4 == 3) {bw2.write("A");bw2.flush();}outputThisRound[0] = true;outputThisRound[1] = false;System.out.println("outputA signal outputB!");cond2.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void outputB() {lock.lock();try {while(outputThisRound[1]) {System.out.println("outputB begin to await!");cond2.await();}if (ctl % 4 == 0) {bw2.write("B");bw2.flush();} else if (ctl % 4 == 1) {bw1.write("B");bw1.flush();} else if (ctl % 4 == 2) {bw4.write("B");bw4.flush();} else if (ctl % 4 == 3) {bw3.write("B");bw3.flush();}outputThisRound[1] = true;outputThisRound[2] = false;System.out.println("outputB signal outputC!");cond3.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void outputC() {lock.lock();try {while(outputThisRound[2]) {System.out.println("outputC begin to await!");cond3.await();}if (ctl % 4 == 0) {bw3.write("C");bw3.flush();} else if (ctl % 4 == 1) {bw2.write("C");bw2.flush();} else if (ctl % 4 == 2) {bw1.write("C");bw1.flush();} else if (ctl % 4 == 3) {bw4.write("C");bw4.flush();}outputThisRound[2] = true;outputThisRound[3] = false;System.out.println("outputC signal outputD!");cond4.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void outputD() {lock.lock();try {while(outputThisRound[3]) {System.out.println("outputD begin to await!");cond4.await();}if (ctl % 4 == 0) {bw4.write("D");bw4.flush();} else if (ctl % 4 == 1) {bw3.write("D");bw3.flush();} else if (ctl % 4 == 2) {bw2.write("D");bw2.flush();} else if (ctl % 4 == 3) {bw1.write("D");bw1.flush();}outputThisRound[3] = true;outputThisRound[0] = false;ctl++;System.out.println("outputD signal outputA!");cond1.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}}}
- 多线程写文件问题解答
- 多线程写文件
- 多线程写文件
- 多线程写文件
- 多线程写文件
- Java多线程写文件
- 多线程写文件操作
- Python多线程写文件实例
- Python多线程写文件实例
- 多线程写文件是否提高效率?
- 多线程并发写文件-文件锁
- 问题解答
- 问题解答
- 问题解答
- SQLite多线程写锁文件解决方案
- 多线程同时写一个文件示例
- SQLite多线程写锁文件解决方案
- Java 多线程写同一个文件实现
- 多线程打印问题
- 外部网关协议RGP
- Python 不区分大小写对字符串列表排序
- JS判断数字/字母/中文
- JavaMail 发送邮件简单 Demo
- 多线程写文件问题解答
- 分布式程序开发平台ICE概览
- Android 图片拖动以及放大缩小
- 通过实例理解javascript 的call()与apply()
- 【cinder】从snapshot中创建volume都在同一节点的问题
- 中华人民共和国刑法
- Linq系列
- SP2-1503: 无法初始化 Oracle 调用界面
- Load Average解析