2015-11-04 37 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); 
} 

因此,这是你如何与循环内的线程工作。你不需要暂停你的循环。

希望有所帮助。