`
落叶留步
  • 浏览: 53293 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

java多线程写文件

 
阅读更多

 

// 题目: 多线程写文件

/**

有四个线程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....

**/

 

我的思路:

1.每个线程记录自己要写入文件的顺序,写完一遍所有文件以后又从头来。

2.有个类似线程调度的东西,这里面按顺序执行线程,执行完所有线程以后又从头来。

3.每个线程执行的时候,要更新自己下一次写入的文件,如果写完一遍又从头来。

4.每个线程执行完以后,需要更新线程调度里面下一个要执行的线程。

 

下面的代码,写的比较潦草,也没有写什么注释,有些不必要的代码也没有整理。

 

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

public class ThreadApp {

	public static void main(String[] args) {

		final Re r = new Re();
		WriteTask t1 = new WriteTask(1, 1, "A", new int[] { 1, 4, 3, 2 }, r);
		WriteTask t2 = new WriteTask(2, 2, "B", new int[] { 2, 1, 3, 4 }, r);
		WriteTask t3 = new WriteTask(3, 3, "C", new int[] { 3, 2, 1, 4 }, r);
		WriteTask t4 = new WriteTask(4, 4, "D", new int[] { 4, 3, 2, 1 }, r);

		new Thread(t1).start();
		new Thread(t2).start();
		new Thread(t3).start();
		new Thread(t4).start();

	}

}

class Re {
    // 下一个写入的线程id
	public volatile int nextThread = 1;
}

class WriteTask implements Runnable {

	// 1 - file1 file4 file3 file2
	// 2 - file2 file1 file3 file4
	// 3 - file3 file2 file1 file4
	// 4 - file4 file3 file2 file1

	//
	private volatile boolean stop = false;
	private Re lock;
	//
	private final int id;
	private final String ch;
	private final int[] fileNos;
	private int currfileNos;

	public WriteTask(int id, int nextThread, String ch, int[] fileNos, Re lock) {
		this.id = id;
		this.ch = ch;
		this.fileNos = fileNos;
		this.lock = lock;
	}

	@Override
	public void run() {
		while (!stop) {
			synchronized (lock) {
			  // 如果不相等 表示当前线程不需要写入 让给其他线程
              while (id != lock.nextThread) {
					try {
						lock.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}

				if (currfileNos == 4)
					currfileNos = 0;
				FileWriter fw = null;
				try {
					fw = new FileWriter("file" + fileNos[currfileNos], true);
					fw.write(ch);
					if (++currfileNos > 3)
						currfileNos = 0;
					// 如果大于4了则重置
					if (++lock.nextThread > 4)
						lock.nextThread = 1;
				} catch (IOException e) {
					e.printStackTrace();
					stop = true;
				} finally {
					try {
						if (null != fw)
							fw.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
					// 唤醒所有的线程
					lock.notifyAll();
				}
			}

		}

	}

}

   

 

   下面的是改进的代码,比上面的清楚很多了。

 

import java.io.FileWriter;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class ThreadApp {

	public static void main(String[] args) {

		final ThreadSchedule r = new ThreadSchedule();
		WriteTask t1 = new WriteTask(1, "A", new int[] { 1, 4, 3, 2 }, r);
		WriteTask t2 = new WriteTask(2, "B", new int[] { 2, 1, 3, 4 }, r);
		WriteTask t3 = new WriteTask(3, "C", new int[] { 3, 2, 1, 4 }, r);
		WriteTask t4 = new WriteTask(4, "D", new int[] { 4, 3, 2, 1 }, r);

		new Thread(t1).start();
		new Thread(t2).start();
		new Thread(t3).start();
		new Thread(t4).start();

	}

}

/**
 * 调度线程
 */
class ThreadSchedule {
	public int willRunThreadId = 1;
	
	public final int threadCount = 4;
}

/**
 * 写任务
 */
class WriteTask implements Runnable {

	// 1 - file1 file4 file3 file2
	// 2 - file2 file1 file3 file4
	// 3 - file3 file2 file1 file4
	// 4 - file4 file3 file2 file1

	//
	private volatile boolean stop = false;
	private ThreadSchedule lock;
	// 线程id
	private final int id;
	// 写入的字符
	private final String ch;
	// 写入文件的编号
	private final int[] fileNos;
	// 总文件数
	private final int countFile = 4;
	// 当前正要写入的文件编号
	private int currfileNo;

	public WriteTask(int id, String ch, int[] fileNos, ThreadSchedule lock) {
		this.id = id;
		this.ch = ch;
		this.fileNos = fileNos;
		this.lock = lock;
	}

	@Override
	public void run() {
		while (!stop) {
			synchronized (lock) {
				while (id != lock.willRunThreadId) {
					try {
						lock.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
				FileWriter fw = null;
				try {
					
					System.out.println("线程 " + id + " 正在写入  " +"file" + fileNos[currfileNo] + "  ");
					
					TimeUnit.SECONDS.sleep(1);
					
					fw = new FileWriter("file" + fileNos[currfileNo], true);
					fw.write(ch);
					if (++currfileNo == countFile)
						currfileNo = 0;
					// 如果大于4了则重置
					if (++lock.willRunThreadId > lock.threadCount)
						lock.willRunThreadId = 1;
				} catch (IOException e) {
					e.printStackTrace();
					stop = true;
				} catch (InterruptedException e) {
					e.printStackTrace();
				} finally {
					try {
						if (null != fw)
							fw.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
					// 唤醒所有的线程
					lock.notifyAll();
				}
			}

		}

	}

}

 

 

 

 

 

分享到:
评论

相关推荐

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    java多线程读写文件示例

    Java多线程读写文件示例 Java多线程读写文件示例是指在Java编程语言中使用多线程技术来实现文件的读写操作。该示例主要介绍了如何使用Java多线程技术来实现文件的读写操作,包括文件的写入、读取和同步控制等。 ...

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

    java多线程文件传输

    Java多线程文件传输是Java编程中一个重要的实践领域,特别是在大数据处理、网络通信和分布式系统中。在Java中,多线程可以提高程序的执行效率,尤其在处理并发任务时,如大文件的上传、下载和传输。下面将详细探讨...

    java实现多线程文件传输

    在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源...在提供的`java多线程文件传输`压缩包中,可能包含了实现这些概念的示例代码,通过分析和学习,可以更好地理解多线程文件传输的原理和实践。

    java多线程加队列上传文件_后台处理

    本文将详细介绍一个基于Java实现的多线程文件上传系统,并结合队列管理技术来优化后台处理流程。该系统通过创建多个线程来并行处理客户端的文件上传请求,同时利用队列结构来协调任务的调度与执行。 #### 关键技术...

    Java 单线程复制文件和多线程复制文件的比较

    Java 单线程复制文件和使用RandomAccessFile多线程复制文件的比较,对应博客地址为http://blog.csdn.net/zmichealchow/article/details/38687431

    多线程对文件读写操作(java)

    2. **线程安全的文件操作**:在进行多线程文件操作时,线程安全是非常重要的。如果不正确地同步线程,可能会导致数据不一致或者丢失。Java提供了一些同步机制,如`synchronized`关键字、`Lock`接口(如`...

    Java多线程文件下载

    Java多线程文件下载是一种高效的下载策略,它通过将大文件分割成多个部分,然后创建多个线程分别下载这些部分,来实现并行下载。这种技术可以显著提高下载速度,尤其是在网络条件不稳定或者带宽有限的情况下。下面...

    java多线程下载文件

    ### Java多线程断点下载文件:关键技术与实现 在当今高速互联网环境下,高效的数据传输技术变得至关重要。Java多线程断点续传文件下载技术就是一种能够显著提高下载速度和稳定性的方法。本文将深入解析Java多线程...

    Java多线程文件分片下载实现的示例代码

    Java多线程文件分片下载实现的示例代码 本文将详细介绍Java多线程文件分片下载的实现示例代码,通过示例代码,大家可以学习和理解多线程文件分片下载的技术难点和解决方案。 多线程下载的技术难点 ---------------...

    Java 利用多线程实现文件的分片下载

    刚学完多线程和线程池,以及线程爱好者。 使用场景及目标: 大文件的快速下载,经测试在100M带宽的网络下,下载一个40M的文件,不超过两秒钟,当然还得根据自己电脑的配置来讲。 其他说明: 文件如果特别小,而...

    java多线程复制文件

    java多线程复制文件

    java 多线程操作数据库

    ### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...

    JAVA-多线程 所有文件

    这个“JAVA-多线程 所有文件”压缩包很可能包含了一系列关于Java多线程学习的源代码示例和相关文档。下面我们将深入探讨Java多线程的相关知识点。 1. **线程的概念**:线程是操作系统分配CPU时间的基本单位,一个...

    java多线程分页查询

    ### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...

    java多线程文件传输(基于swing)

    Java多线程文件传输是一个复杂而实用的编程概念,它结合了Java的Socket编程和Swing GUI库,用于实现高效的数据交换。在这个项目中,开发者创建了一个基于Socket的多线程文件传输系统,允许用户通过图形化用户界面...

    java实现多线程下载文件

    通过以上步骤,我们可以设计并实现一个高效的多线程文件下载系统。在实际项目中,还可以考虑使用成熟的库,如Apache HttpClient或OkHttp,它们提供了对多线程下载的良好支持。同时,结合Java的并发库,可以构建出更...

    java多线程进度条

    本主题将深入探讨如何在Java多线程环境下实现进度条功能。 首先,理解Java多线程的基本概念至关重要。Java通过Thread类和Runnable接口来支持多线程。创建一个新线程通常有两种方式:继承Thread类并重写run()方法,...

    java 多线程下载 (单文件)

    Java多线程下载技术主要应用于提高大文件下载的效率,通过将文件分割成多个部分,同时启动多个线程分别下载这些部分,从而实现并行下载,加快下载速度。以下是对这个主题的详细解释: 1. **Java多线程基础**: 在...

Global site tag (gtag.js) - Google Analytics