加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 程序设计 > 正文

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

发布时间:2020-05-23 14:28:26 所属栏目:程序设计 来源:互联网
导读:文件读写线程: 使用synchronized 配合wait/notify,稳定性好,线程数越多越快 package cn.thread.fen.open; import java.io.FileInputStream; import java.io.IOException; import java.util.Date; public class FileReadThread extends T

文件读写线程:
使用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(),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(),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:LoglinkType.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:Logbc2.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();//起动写线程 }}

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读