2016-02-12 71 views
1

我正在使用Executorsevice從數據庫生成文件。我正在使用jdbc和核心java將表格數據存入文件。Java executorsevice正在關閉,即使它的線程正在運行

使用10個線程創建Executorservice後,我在for循環中提交60個線程以並行獲取60個文件。這對小數據和少數列的表格工作正常。但是,如果文件很大,並且對於具有更多列的表,正在處理巨大表數據/更多列表的線程正在停止,而在其他線程完成時不會在日誌中提供任何信息。

ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT); 
     for (String filename : filenames) { 
      EachFileThread worker = new EachFileThread(destdir, converter, 
        filename, this); 
      executor.execute(worker); 
     } 
     executor.shutdown(); 

裏面Eachfilethread我讀取XML並獲得列,表,形成一個查詢,執行查詢和格式化的數據,並把數據轉換成文件

forTable = (FileData) converter.convertFromXMLToObject(filename + ".xml"); 
    String query = getQuery(forTable); 
    statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); 
    resultSet = statement.executeQuery(query); 
resultSet.setFetchSize(3000); 
    WriteData(resultSet, filepath, forTable);(formatting the data from db and then writing to a file) 
+3

添加您的代碼會幫助調試。 –

+0

添加了代碼。 – vardhan

+0

你可以添加你的EachFileThread代碼嗎? –

回答

1

的問題是,你是不等待所有的工作完成他們正在做的事情。作爲@msandiford在評論所說,你應該調用shutdown()後添加調用awaitTermination(..)因爲它是在樣品shutdownAndAwaitTermination()方法上https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html

例如,你可以嘗試做它像這樣:

ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT); 
for (String filename : filenames) { 
    EachFileThread worker = new EachFileThread(destdir, converter, filename, this); 
    executor.execute(worker); 
} 
executor.shutdown(); 
try { 
    // Wait a while for existing tasks to terminate 
    if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { 
     executor.shutdownNow(); // Cancel currently executing tasks 
     // Wait a while for tasks to respond to being cancelled 
     if (!executor.awaitTermination(60, TimeUnit.SECONDS)) 
      System.err.println("Executor did not terminate"); 
    } 
} catch (InterruptedException ie) { 
    // (Re-)Cancel if current thread also interrupted 
    executor.shutdownNow(); 
    // Preserve interrupt status 
    Thread.currentThread().interrupt(); 
} 
+0

它沒有工作,該線程應該寫一個近6GB的文件,它的生成0 kb文件。當我單獨跑它的工作正常。 – vardhan

+0

@vardhan示例代碼的超時時間爲1分鐘,可能對於您的所有工作完成而言太短。單獨運行它需要多長時間才能完成這項工作? – MJar

+0

如果文件的大小更大,或者表中有大量數據,則此代碼需要20分鐘,否則只需要更少的時間。 – vardhan