`

文件读写线程-写线程依赖读线程(减少文件读写时间),多线程

    博客分类:
  • java
阅读更多

文件读写线程:
使用synchronized 配合wait/notify,稳定性好,线程数越多越快

 

package cn.thread.fen.open;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date;

public class FileReadThread extends Thread{
 private FileInputStream is;
 private int bufSize=1024;
 private volatile byte[] buf=new byte[1024];   
 private volatile int len = 0;

 public void run() {
  try {
   synchronized(this) {
    while (this.getLen()!=-1) { //读完整个文件,len=-1
     if (this.getLen() != 0) {
      wait(10);
     }
     else{
      int length = this.getIs().read(this.getBuf(), 0, this.bufSize);
       this.setLen(length);
       notify();
      
//      System.out.println("----------"+length);
     }
     }
    }
  } catch (IOException e) {
   e.printStackTrace();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  finally{
   try {
    this.getIs().close();
   } catch (IOException e) {
    e.printStackTrace();
   }
   String readTime=new Date().toString();
   System.out.println("========== readOver Time : "+readTime +" ==========");
  }
 }

 public FileInputStream getIs() {
  return is;
 }

 public void setIs(FileInputStream is) {
  this.is = is;
 }

 public byte[] getBuf() {
  return buf;
 }

 public void setBuf(byte[] buf) {
  this.buf = buf;
 }

 public int getLen() {
  return len;
 }

 public void setLen(int len) {
  this.len = len;
 }
 
}

package cn.thread.fen.open;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

public class FileWriteThread extends Thread {
// private volatile byte[] buf=new byte[1024];   //文件读写公用的缓存数据
// private volatile int len = 0;//读取的字符长度,公用
 private FileOutputStream os;
 private FileReadThread r;
 
 public FileWriteThread(FileReadThread r){
  this.r=r;
 }
 
 public void run() {
  synchronized(this){
  while(true){ 
   if(r.getLen()==0){
    try {
     wait(10);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
   else{
//    System.out.println("*********"+r.getLen());
    if(r.getLen()==-1){ //读线程结束,写线程也结束
     try{
      this.getOs().close();
     } catch (IOException e) {
      e.printStackTrace();
     }
     break;
    }
    try {
     this.getOs().write(r.getBuf(), 0, r.getLen());
//     os.flush();
    } catch (IOException e) {
     e.printStackTrace();
    }

    r.setLen(0);
    notify();
   }
  }
  }
  String writeTime=new Date().toString();
  System.out.println("========== writeOver Time : "+writeTime +" ==========");
 }

 public FileOutputStream getOs() {
  return os;
 }

 public void setOs(FileOutputStream os) {
  this.os = os;
 }
 
 
}

 

package cn.thread.fen.open;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Date;

public class TestThread {

 /**
  *
  */
 public static void main(String[] args) throws Exception {

//  String startTime=new Date().toString();
//  System.out.println("========== startTime : "+startTime +" ==========");
//  
//  File file = new File("E:\\Log\\linkType.txt");
//  int i=(int)(Math.random()*100);
//  File of = new File("E:\\Log\\"+i+".txt");
//  
//  FileReadThread r = new FileReadThread();
//  r.setIs(new FileInputStream(file));
//  FileWriteThread w = new FileWriteThread(r);
//  w.setOs(new FileOutputStream(of));
//
//  r.start();  //起动读线程
//  w.start(); //起动写线程 
  
  
  test();
  
 }

 private static void test(){
  String startTime=new Date().toString();
  System.out.println("========== startTime : "+startTime +" ==========");
  
  File file = new File("E:\\Log\\bc2.txt");
  int i=(int)(Math.random()*100);
  File of = new File("E:\\Log\\"+i+".txt");
  
  FileReadThread r = new FileReadThread();
  try {
   r.setIs(new FileInputStream(file));
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
  FileWriteThread w = new FileWriteThread(r);
  try {
   w.setOs(new FileOutputStream(of));
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }

  r.start();  //起动读线程
  w.start(); //起动写线程 
  
 }
}

分享到:
评论

相关推荐

    VC++ 多线程文件读写操作实例

    简单的利用互斥变量、原子操作等技术实现多线程读写文件时的互斥,从而确保文件在操作过程中不会被破坏。例子并没有使用很多复杂的逻辑。适合刚接触多线程编程的新手学习理解多线程程序的编程思路。

    用多线程实现串口读写数据以及文件的读写

    本教程聚焦于如何利用多线程实现串口(Serial Port)读写数据及文件的读写操作,这对于理解和开发高效通信系统至关重要。 首先,我们要理解什么是串口通信。串口通信是一种基于串行数据传输的通信方式,它通过一条...

    python多线程同步之文件读写控制

    在Python编程中,多线程同步对于文件读写控制至关重要,因为如果不加以控制,多个线程同时访问同一文件可能会导致数据不一致或者错误。这里我们将深入探讨如何在Python中使用多线程同步来确保文件读写的安全性。 ...

    多线程通信读写文件

    在读取文件时,多线程可能带来性能提升,因为读操作通常是非阻塞的,多个线程可以并行读取文件的不同部分。然而,写操作通常需要原子性,即不能被中断,因此可能需要使用锁来保护。 此外,还可以使用信号量...

    多线程文件读写测试

    在IT领域,多线程文件读写测试是一个重要的性能优化技术,尤其对于处理大量数据的程序来说至关重要。本文将深入探讨这个主题,并基于提供的文件名列表解析可能的项目结构。 标题"多线程文件读写测试"暗示了这是一个...

    C#多线程读写sqlite

    在C#编程中,多线程技术常用于提高应用程序的执行效率,特别是在处理数据库操作时。SQLite是一款轻量级、嵌入式的关系型数据库,它广泛应用于桌面应用、移动设备和Web开发。当多线程环境对SQLite进行读写操作时,...

    多线程样例一 读写参数文件

    读文件费时间,所以开一个线程读文件。 抽象后的类似demo: 假定读文件需要0.6秒,图像处理(用存文件代替)需要0.5秒,各执行100次。 类和函数 读取文件函数: 一,List增加本序号(0开始)。 二,随机生成5000...

    Qt多线程读写大型文本文件项目

    3.读取的文件使用多线程处理,不影响显示界面正常操作; 4.读取过来的文件如有修改,需要保存修改部分; 5.读、写文件需要显示处理进度; 6.增加一个列表,用于展示文本文件的类型、大小、行数等。 一、功能列表 1....

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

    在Java编程中,多线程技术是提升程序执行效率的关键之一,特别是在进行文件读写操作时。本主题将深入探讨如何使用多线程来优化文件的读取和写入过程,以及需要注意的相关问题。 首先,我们需要理解单线程与多线程在...

    多线程文件读写ThreadREADWrite

    标题中的"多线程文件读写ThreadREADWrite"指的是在同一时间内,通过两个或更多的线程分别进行文件的读取和写入操作。这种技术可以提升应用程序的性能,尤其是在处理大量数据时。然而,多线程同时读写同一文件会引发...

    一个多线程同步读写的小程序

    在这个“一个多线程同步读写的小程序”中,我们看到开发者尝试通过创建读线程和写线程来同时进行数据的读取和写入,以优化程序的执行流程。 首先,让我们深入理解多线程的概念。线程是操作系统分配处理器时间的基本...

    操作系统-创建多线程-读者写者

    ### 操作系统中的多线程创建与读者写者问题解析 #### 多线程概念介绍 在计算机科学中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以拥有多个线程,而每个...

    Delphi中用多线程实现日志文件的读写与管理

    本文将深入探讨如何在Delphi中利用多线程技术来实现日志文件的高效读写与管理。 首先,了解多线程的概念。在单线程环境下,所有的操作都是顺序执行的,如果在处理日志时阻塞了主线程,可能会导致用户界面的卡顿。而...

    易语言多线程读取大文本文件

    在“易语言多线程读取大文本文件”这个主题中,核心概念是多线程和文件I/O操作。多线程允许程序同时执行多个独立的任务,提高效率,尤其在处理大型文件时,可以将任务分割成多个部分,由不同的线程并行处理。这可以...

    C#使用读写锁三行代码简单解决多线程并发的问题

    本文通过三行代码展示了如何使用读写锁解决多线程并发写入文件的冲突。 读写锁的核心在于,它允许多个线程同时读取资源,但只允许一个线程写入资源。这样,当多个线程尝试写入时,只有一个线程能够获得写锁,其他...

    基于多线程和gdal类库的影像读写

    在IT领域,尤其是在地理信息系统(GIS)开发中,"基于多线程和gdal类库的影像读写"是一个关键的技术点。GDAL(Geospatial Data Abstraction Library)是一个强大的开源库,用于处理多种遥感和地图数据格式,包括TIFF...

    delphi 多线程读写测试

    在 Delphi 开发环境中,多线程技术是提高应用程序性能和响应能力的重要手段。尤其是在处理大量数据读写操作时,多线程可以显著提升效率,避免阻塞主线程,从而提供更好的用户体验。以下是对"Delphi 多线程读写测试...

    java多线程读取文件

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

    多线程读取文件

    在IT领域,多线程是并发处理任务的关键技术,尤其在读取大文件时,能够显著提高程序的执行效率。本文将围绕“多线程读取文件”这一主题,结合给定的标签“源码”和“工具”,深入探讨如何在Java等编程语言中实现这一...

    多线程读写问题循环buffer

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在处理大文件读写时,可以显著提升程序的效率。本示例中的“多线程读写问题循环buffer”着重探讨了如何在多个线程之间安全地共享一个循环缓冲区,以实现高效...

Global site tag (gtag.js) - Google Analytics