`
wentise
  • 浏览: 23225 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

多线程写一个文件,回字的3个写法

    博客分类:
  • java
阅读更多
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;

import org.apache.commons.io.IOUtils;


public class MuFile implements Runnable{

	static File file = new File("D:\\log6666666.txt");
	private int chunk;
	private static final ReentrantLock lock = new ReentrantLock();

	public MuFile(int chunk){
		this.chunk=chunk;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		if(!file.exists()){try {
			file.createNewFile();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}}else{
file.delete();
		}
		List<Thread> tl = new ArrayList<Thread>();
		for(int i=0;i<5;i++){
			Thread m = new Thread(new MuFile(i));
			m.setName("QJW"+i);
			tl.add(m);
			m.start();
		}
		for(int i=0;i<tl.size();i++){
			Thread m =tl.get(i);
			try {
				m.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	

	public void run() {
		List<String> lines = new ArrayList<String> ();
		String tname = Thread.currentThread().getName();
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		for(int j=0;j<3;j++){
			lines.add(tname+" line "+j);
		}
		write(lines,chunk);
		//write2(lines,chunk);
		//write3(lines,chunk);
		
	}
	void write(List<String> lines,int chunk) {
		synchronized (file) {
			//File file = new File("D:\\sample4final.txt");
			FileWriter fw = null;
			BufferedWriter bw = null;
			try {
				fw = new FileWriter(file, true);
				bw = new BufferedWriter(fw);
String tname = Thread.currentThread().getName();
				if (!lines.isEmpty()) {
					IOUtils.write(chunk+"  -"+tname+"    start:    \n", bw);
					IOUtils.writeLines(lines, null, bw);
					IOUtils.write(chunk+"  -"+tname+"    end:     \n", bw);
					bw.flush();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				throw new RuntimeException(e);
			} finally {
				IOUtils.closeQuietly(bw);
				IOUtils.closeQuietly(fw);
			}
		}

	}
	void write2(List<String> lines,int chunk) {
		
			//File file = new File("D:\\sample4final.txt");
			FileWriter fw = null;
			BufferedWriter bw = null;
			try {
				fw = new FileWriter(file, true);
				bw = new BufferedWriter(fw);
String tname = Thread.currentThread().getName();
				if (!lines.isEmpty()) {
					IOUtils.write(chunk+"  -"+tname+"    start:    \n", bw);
					IOUtils.writeLines(lines, null, bw);
					IOUtils.write(chunk+"  -"+tname+"    end:     \n", bw);
					bw.flush();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				throw new RuntimeException(e);
			} finally {
				IOUtils.closeQuietly(bw);
				IOUtils.closeQuietly(fw);
			}
	

	}
	
	void write3(List<String> lines,int chunk) {
		lock.lock();  // block until condition holds

		//File file = new File("D:\\sample4final.txt");
		FileWriter fw = null;
		BufferedWriter bw = null;
		try {
			fw = new FileWriter(file, true);
			bw = new BufferedWriter(fw);
String tname = Thread.currentThread().getName();
			if (!lines.isEmpty()) {
				IOUtils.write(chunk+"  -"+tname+"    start:    \n", bw);
				IOUtils.writeLines(lines, null, bw);
				IOUtils.write(chunk+"  -"+tname+"    end:     \n", bw);
				bw.flush();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		} finally {
			IOUtils.closeQuietly(bw);
			IOUtils.closeQuietly(fw);
			lock.unlock();
		}


}

}

分享到:
评论

相关推荐

    易语言简单多线程写法源码

    总之,易语言简单多线程写法源码是学习多线程编程的一个好起点,特别是对于初学者,它可以帮助理解多线程的基本原理和实践方法。通过实际操作和调试这些源码,我们可以更好地掌握易语言中的多线程编程技术,并为将来...

    e语言几个简单多线程写法

    标题"e语言几个简单多线程写法"表明本文将探讨如何在e语言(可能指的是Erlang或者一种类似的编程语言)中实现多线程编程,适用于初学者。描述中提到“新手可以参考源码多学习一下,我也是在学习中”,暗示我们将分享...

    多线程写法(精易模块线程池和鱼刺模块线程池)

    在IT行业中,多线程是程序设计中的一个重要概念,特别是在处理并发操作时,如网络服务、数据处理和用户界面更新等。多线程允许程序同时执行多个任务,从而提高资源利用率和程序性能。本篇文章将重点探讨两种线程池...

    jni中用多线程调用java代码

    例如,你可以创建一个方法来启动一个新的线程,并传入一个回调函数,这个函数将在新线程中被调用。 2. **生成JNI头文件**:使用`javah`工具(或者在Android Studio中自动完成)根据你的Java类生成对应的C/C++头文件...

    c++多线程写法与案例 c++多线程保存点云

    一个基本的多线程程序通常包括以下步骤: 1. **创建线程**:使用 `std::thread` 类创建新线程。例如: ```cpp std::thread thread1(&function_to_run); ``` 2. **线程执行**:创建的线程会开始执行传递给 `std:...

    [鱼刺多线程-鱼刺类_多线程应用模块v5.4完整源码

    鱼刺类_多线程应用 - 更新日志。5.4.3(2017-12-01)。*修正 修正鱼刺类_线程池Ex/线程池Ex一处很难被触发的BUG。*修改 去除所有用到取启动时间的函数/方法 (修正在系统开机超过29天的机器上可能会出现问题)。*修正 类...

    cpp-在redis30上实现多线程implementmultithreadinginredis30

    为了应对 I/O 压力,Redis 3.0 引入了一个多线程模型,但请注意,这并不意味着 Redis 变成了一个多线程处理命令的数据库。Redis 仍然只有一个主线程负责执行命令,而新增的线程主要是用于处理网络 I/O 操作,即读取...

    Winform实现多线程异步更新UI(进度及状态信息)

    在Windows桌面应用开发中,WinForm是一个常用的框架,用于创建图形用户界面(GUI)。然而,当处理耗时操作时,如大数据处理、网络通信或I/O密集型任务,如果这些操作在主线程(UI线程)上执行,将导致应用程序响应变...

    同步异步多线程SOCKET通讯

    在同步多线程环境下,每个线程负责一个独立的Socket连接。当线程接收到客户端请求时,它会阻塞等待数据传输完成,然后再处理下一个请求。这种方式易于理解和实现,但可能会遇到“线程饥饿”问题,即某些线程可能长...

    多线程完美不崩溃防卡死-易语言

    在IT领域,多线程是程序设计中的一个重要概念,尤其在高性能和响应速度上起着关键作用。在易语言环境中,实现多线程并确保程序的稳定性和避免卡死问题是一项挑战,但也是提升用户体验的有效手段。本教程将探讨如何在...

    java csv大数据量导出(千万级别,不会内存溢出)

    在Java开发中,处理大数据量的数据导出是一个常见的挑战,特别是在CSV格式的文件处理上。CSV(Comma Separated Values)是一种广泛使用的数据交换格式,因其简单性和通用性而受到青睐。然而,当数据量达到千万级别时...

    易语言-winhttp多线程下载文件 支持百度网盘地址纯

    在这个“易语言-winhttp多线程下载文件 支持百度网盘地址纯”的项目中,我们主要讨论的是如何利用易语言来实现一个功能强大的文件下载程序,特别是针对百度网盘的资源。 首先,我们要理解的是“winhttp”库。...

    VC写的简单COM,可以从中稍微了解一些com的写法

    VC项目通常包含一个.idl文件,编译后生成头文件和实现文件。 4. ** ATL(Active Template Library)**:VC提供了ATL库,简化了COM组件的开发。ATL模板类提供了创建COM对象、实现IUnknown和特定接口的快捷方式。 5....

    多线程POST注册例子-易语言

    在IT行业中,多线程编程是一项重要的技术,特别是在网络应用中。"多线程POST注册例子-易语言"这个主题,意味着我们将探讨如何使用易语言(Easy Language)来实现一个利用多线程处理POST请求的注册功能。易语言是一种...

    java输入输出流的两种写法

    - 可以通过 `PipedInputStream` 和 `PipedOutputStream` 实现线程间的通信,或者使用 `SequenceInputStream` 合并多个输入流。 8. 转换流: - `InputStreamReader` 和 `OutputStreamWriter` 可以将字节流转换为...

    axel.sh,axel多线程下载工具Linux

    这是Centos系统中,自动下载并且安装axel包的一个脚本,使用完可以使用axel多线程来下载镜像源中的文件,非常快速好用

    易语言-鱼刺多线程例程 [v4.7]代理智能提取

    1.2 如果程序目录下没有`Config_Proxy.ini`这个文件 请调用一次`代理智能提取_创建()`会自动生成在运行目录下 1.3 你也可以用代码来配置这些信息 直接调用 `代理智能提取_置代理提取参数()` `代理智能提取_置代理...

    Linux之select多socket范例

    通过分析和学习这个代码,你可以理解如何在实际项目中应用`select`函数来处理多个UDP socket,以及如何构建一个高效的多线程UDP服务器。 总的来说,`select`是Linux网络编程中的重要工具,尤其适用于需要同时处理多...

Global site tag (gtag.js) - Google Analytics