Java多线程文件保存

时间:2013-10-16 20:35:50

标签: java multithreading file-io threadpool

我有一个创建多个无尽线程的应用程序。每个线程读取一些信息,我使用线程池创建了一些任务(很好)。

我添加了处理数组的其他函数,当它完成时,它将这些ArrayList发送到新的线程,将这些列表保存为文件。我已经用3种方式实现了保存,其中只有一种成功。我想知道为什么其他两种方法没有。

  1. 我创建了一个线程(通过new Thread(Runnable))并为其提供了该文件的数组和名称。在线程构造函数中,我创建了PrintWriter并保存了文件。它运行没有任何问题。 (我有1-10个文件保存线程并行运行)。

  2. 如果我将保存代码outputStream.println(aLog);放在Run方法中,它永远不会到达它,并且在构造函数完成线程退出后。

  3. 我将创建的runnables(文件保存)放在线程池中(保存的代码在run()方法中)。当我发送1个任务(1个文件保存)时,一切都很好。池中添加了超过1个任务(非常快),创建了异常(在调试时我可以看到所有需要的信息都可用)并且某些文件未保存。

  4. 可以解释一下差异行为吗? 感谢

    请参阅下面的代码。 (从作为无限线程类的一部分的函数开始,也将一些任务放在池中),在无尽线程中创建的池:       ExecutorService iPool = Executors.newCachedThreadPool();

    private void logRate(double r1,int ind){
     historicalData.clear();
        for (int i = 499; i>0; i--){
          // some Code
    
         Data.add(0,array1[ind][i][0] + "," + array1[ind][i][1] + "," + 
                              array1[ind][i][2] + "," + array1[ind][i][3] + "," +
                              array2[ind][i] + "\n" );
         }
          // first item
          array1[ind][0][0] = r1; 
          array1[ind][0][1] = array1[ind][0][0] ;
          array1[ind][0][2] = array1[ind][0][0] ;
          array2[ind][0] = new SimpleDateFormat("HH:mm:ss yyyy_MM_dd").format(today); 
    
          Data.add(0,r1+","+r1+","+r1+","+r1+ "," + array2[ind][0] + '\n') ;
    
          // save the log send it to the pool (this is case 3)
          //iPool.submit(new FeedLogger(fName,Integer.toString(ind),Data));
          // Case 1 and 2 
          Thread fl = new Thread(new FeedLogger(fName,Integer.toString(ind),Data)) ;
        }
    

    这是FeedLogger类:

    public class FeedLogger implements Runnable{
    private List<String> fLog = new ArrayList<>() ;
    PrintWriter outputStream = null;
    String asName,asPathName;
    
    public FeedLogger(String aName,String ind, List<String> fLog) {
    this.fLog = fLog;
    this.asName = aName;
    
    try {
        asPathName = System.getProperty("user.dir") + "\\AsLogs\\"  + asName + "\\Feed" + ind 
                                        + ".log" ;
    
         outputStream = new PrintWriter(new FileWriter(asPathName));
         outputStream.println(fLog); Case 1 all is fine
         outputStream.flush(); // Case 1 all is fine
         outputStream.close(); Case 1 all is fine
    
    }
    catch (Exception ex) {
        JavaFXApplication2.logger.log(Level.SEVERE, null,asName + ex.getMessage());
     }
    }
    
    @Override
    public void run()
    {
     try{
        outputStream.println(fLog); // Cas2 --> not reaching this code, Case3 (as task) create 
                                                         exception when we have multiple tasks
        outputStream.flush();
        } 
      catch (Exception e) {
          System.out.println("err in file save e=" + e.getMessage() + asPathName + " feed size=" +  
                              fLog.size()); 
          JavaFXApplication2.logger.log(Level.ALL, null,asName + e.getMessage());
      } 
    
        finally {if (outputStream != null) {outputStream.close();}}
        }
      } 
    

1 个答案:

答案 0 :(得分:1)

您需要在Thread实例上调用start()以使其实际执行某些操作。