0

複数の無限スレッドを作成するアプリがあります。各スレッドはいくつかの情報を読み取り、スレッドプールを使用していくつかのタスクを作成しました (これは問題ありません)。

配列を処理する追加の関数を追加しました。終了すると、それらArrayListの s が新しいスレッドに送信され、それらのリストがファイルとして保存されます。私は 3 つの方法で節約を実装しましたが、成功するのは 1 つだけです。他の2つの方法がそうしなかった理由を知りたいです。

  1. ( 経由で) スレッドを作成しnew Thread(Runnable)、ファイルの配列と名前を指定しました。スレッド コンストラクターで、ファイルを作成しPrintWriterて保存します。何の問題もなく走りました。(1 ~ 10 個のファイル保存スレッドが並行して実行されています)。

  2. メソッドに保存コードを配置するoutputStream.println(aLog);と、Runメソッドに到達せず、コンストラクターが終了した後にスレッドが終了します。

  3. 作成したランナブル (ファイル保存) をスレッド プールに配置します (保存するためのコードはrun()メソッド内にあります)。1 つのタスク (保存する 1 つのファイル) だけを送信すると、すべて問題ありません。プールに複数のタスクが (非常に迅速に) 追加され、例外が作成され (デバッグ時に必要な情報がすべて利用可能であることがわかります)、一部のファイルが保存されません。

違いの動作を説明できますか?ありがとう

以下のコードを参照してください。(いくつかのタスクをプールに配置するエンドレス スレッド クラスの一部である関数から始めて)、エンドレス スレッドで作成されたプール: 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();}}
    }
  } 
4

1 に答える 1

1

Thread インスタンスを呼び出しstart()て、実際に何かを実行させる必要があります。

于 2013-10-16T20:47:07.617 に答える