A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 825176857 中级黑马   /  2015-7-16 00:14  /  367 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.thread;

  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.util.concurrent.ConcurrentLinkedQueue;

  7. /**
  8. * 多线程下写文件
  9. * @author owen.huang
  10. *
  11. */

  12. /**
  13. * 将要写入文件的数据存入队列中
  14. */
  15. class Creater implements Runnable{
  16. private ConcurrentLinkedQueue<String> queue;
  17. private String contents;
  18. public Creater(){}
  19. public Creater(ConcurrentLinkedQueue<String> queue, String contents){
  20.   this.queue = queue;
  21.   this.contents = contents;
  22. }
  23. public void run() {
  24.   try {
  25.    Thread.sleep(100);
  26.   } catch (InterruptedException e) {
  27.    e.printStackTrace();
  28.   }
  29.   queue.add(contents);
  30. }
  31. }

  32. /**
  33. * 将队列中的数据写入到文件
  34. */
  35. class DealFile implements Runnable{
  36. private FileOutputStream out;
  37. private ConcurrentLinkedQueue<String> queue;
  38. public DealFile(){}
  39. public DealFile(FileOutputStream out,ConcurrentLinkedQueue<String> queue){
  40.   this.out = out;
  41.   this.queue = queue;
  42. }
  43. public void run() {
  44.   while(true){//循环监听
  45.    if(!queue.isEmpty()){
  46.     try {
  47.      out.write(queue.poll().getBytes());
  48.     } catch (IOException e) {
  49.      e.printStackTrace();
  50.     }
  51.    }
  52.    try {
  53.     Thread.sleep(100);
  54.    } catch (InterruptedException e) {
  55.     e.printStackTrace();
  56.    }
  57.   }
  58. }
  59. }

  60. /**
  61. * 测试类
  62. */

  63. public class TestMultipleWriteFile {
  64. public static void main(String[] args) throws FileNotFoundException{
  65.   FileOutputStream out = new FileOutputStream(new File("F:"+ File.separator +"test.txt"),true);
  66.   ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
  67.    
  68.   for(int j=0;j<10;j++){
  69.    new Thread(new Creater(queue,j+"--")).start();//多线程往队列中写入数据
  70.   }
  71.   new Thread(new DealFile(out,queue)).start();//监听线程,不断从queue中读数据写入到文件中
  72. }
  73. }
复制代码

2 个回复

倒序浏览
感觉好厉害的样子
回复 使用道具 举报
知识有限   看不懂
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马