2015-11-04 58 views
2

我正在使用Java 1.5從命令行讀取多個參數。參數是平面文件的名稱。我循環通過main方法中的參數,並調用一個方法,這反過來又創建了一堆線程來處理文件。我需要暫停循環,直到所有線程處理第一個參數完成,然後繼續創建第二個參數的線程。我怎麼排隊的參數或暫停在我的主要方法循環執行,直到所有線程處理當前參數完成?在main方法中暫停執行循環,直到所有線程完成Java 1.5

+1

主題和加入 –

回答

0

使用線程池和執行程序。看看java.util.concurrent包。

for(String argument:args){ 
    //you said you want multiple threads to work on a single argument. 
    //create callables instead and use a ThreadPool 
    List<Callable<YourResult>> lstCallables = createCallablesFor(argument); 
    List<Future<YourResult>> futures = Executors.newCachedThreadPool().invokeAll(lstCallables); 
    for(Future<YourResult> future:futures){ 
    //this get() waits until the thread behind the current future is done. 
    // it also returns whatever your callable might return. 
    future.get(); 
    } 
    // at this point, all the threads working on the current argument are finished 
    // and the next loop iteration works on the next argument 
} 
-1

您需要在一個參數的循環內啓動線程作業,以便在一個作業完成後,下一個循環啓動並開始下一個參數的下一個線程作業。此外,你可以在你定義的線程工作中工作。

例子:這只是一個片段

for (int i = 0; i < count; i++) { 
    t[i] = new RunDemo(); 
    String[] serverList = srv[i].split(","); 
    String logName = filename + "_" + serverList[0] + "_log"; 
    String sql = "INSERT INTO .....(any query)"; 
    t[i].setStr("sqlplus -L " + username[i] + "/" + password[i] + "@" 
       + serverList[1] + ":" + serverList[2] + "/" + serverList[3] 
       + " @" + filename1); 
    t[i].setLogName(logName); 
    t[i].setDirectory(dir); 
    try{ 
     conn.UpdateQuery(sql); 
     log.info("Inserted into the table data with query " + sql); 
    } 
    catch (Exception e){ 
     log.info("The data can't be inserted into table with " + e.getMessage() + " sql query " + sql); 
    } 
    new Thread(t[i]).start(); 
} 

在這裏,在不同的服務器列表的每一個循環的新線程創建並啓動。

現在的工作定義如下:

public void run() { 
    JShell jshell = new JShell(); 
    try { 
     log.info("Command is: " + this.str + " log name: " + this.LogName + " in directory: " + this.directory); 
     jshell.executeCommand(this.str, this.LogName, this.directory); 
     log.info("Executed command successfully"); 
    } catch (Exception e1) { 
     log.info("Error at executing command with error stack: "); 
     e1.printStackTrace(); 
    } 
    DBConnection conn1 = new DBConnection(); 
    String sql = "UPDATE patcheventlog SET ENDTIME=SYSDATE WHERE LOGFILE='" + this.directory + this.LogName + "'"; 
    try { 
     //conn1.callConnection("192.168.8.81", "d2he"); 

     conn1.callConnection(ip, sid); 

     conn1.UpdateQuery(sql); 
     conn1.disposeConnection(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    System.out.print(this.LogName); 
} 

因此,這是你如何與循環內的線程工作。你不需要暫停你的循環。

希望有所幫助。