我正在使用Java 1.5从命令行读取多个参数。参数是平面文件的名称。我通过main方法中的参数循环并调用一个方法,该方法又创建了一堆线程来处理文件。我需要暂停循环,直到处理完第一个参数的所有线程完成,然后继续为第二个参数创建线程。如何在我的main方法中对参数进行排队或暂停循环执行,直到所有线程处理当前参数完成?
答案 0 :(得分:0)
使用Threadpool和Executor。看一下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 :(得分:0)
我想知道你是否在寻找像cyclic barriers这样的东西。
答案 2 :(得分:-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();
}
这里在每个循环中创建并启动具有不同serverList的新线程。
现在,作业定义如下:
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);
}
所以这就是你如何使用循环内的线程。你不需要暂停你的循环。
希望有所帮助。