在java中,io是会造成io阻塞的,所以传统的同步读写是十分低效的,最好的方式是异步读写.除了主线程以外开启两个子线程.一个负责读,一个负责写.这就是异步读写.下面来看代码.
package Thread;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.Scanner;
public class UnSyncWriter {
public static void main(String args[]) throws FileNotFoundException {
final LinkedList<String> list = new LinkedList<String>();
final PrintWriter pw = new PrintWriter(new FileOutputStream(
"demo/sql.txt", true));
final Thread writer = new Thread(new Runnable() {
public void run() {
while (true) {
if (list.isEmpty()) {
System.out.println("空buf,睡眠5秒");
pw.flush();
try {
Thread.sleep(5000); //5秒钟检查一次
} catch (InterruptedException e) {
System.out.println("吵尼玛呀!");
}
continue;
}
System.out.println("写入数据");
pw.println(list.removeFirst());
}
}
});
writer.setDaemon(true);
final Thread reader = new Thread(new Runnable() {
public void run() {
Scanner scan = new Scanner(System.in);
while (true) {
String str = scan.nextLine();
list.addLast(str);
if(str.equalsIgnoreCase("q")){
writer.interrupt();
break;
}
}
}
});
writer.start();
reader.start();
}
}
在这个例子中,一共开启了两个线程.一个reader和一个writer. reader负责从用户输入中读取数据,而且把它放入到一个链表中,当用户输入为q时,停止该线程的运行.而writer则负责把链表中的数据放入到对应的文件中.这里要提一下流的本质.流其实是一种模式.即将所有的数据都看做是字符的有序排列来处理的模式.再回到本例中来,本例中,每间隔5000毫秒,writer才检查一次,并将非空的数组中的数据写入到文件中,并且本线程为守护线程,前台线程停止,守护线程也会停止.所以当reader停止以后,writer也会停止.这样就实现了异步读写.