複数の無限スレッドを作成するアプリがあります。各スレッドはいくつかの情報を読み取り、スレッドプールを使用していくつかのタスクを作成しました (これは問題ありません)。
配列を処理する追加の関数を追加しました。終了すると、それらArrayList
の s が新しいスレッドに送信され、それらのリストがファイルとして保存されます。私は 3 つの方法で節約を実装しましたが、成功するのは 1 つだけです。他の2つの方法がそうしなかった理由を知りたいです。
( 経由で) スレッドを作成し
new Thread(Runnable)
、ファイルの配列と名前を指定しました。スレッド コンストラクターで、ファイルを作成しPrintWriter
て保存します。何の問題もなく走りました。(1 ~ 10 個のファイル保存スレッドが並行して実行されています)。メソッドに保存コードを配置する
outputStream.println(aLog);
と、Run
メソッドに到達せず、コンストラクターが終了した後にスレッドが終了します。作成したランナブル (ファイル保存) をスレッド プールに配置します (保存するためのコードは
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();}}
}
}