我是java executatorservice的新手。
我在互联网上举了一些例子,但我有一些基本的疑问。
我创建了一个类似下面的可调用类
public class ReadTest implements Callable<String> {
@Override
public String call() throws Exception {
return "OK";
}
}
我创建了我的主要课程,如下所示
public class ThreadMain {
public static void main(String args[]) {
try {
ExecutorService execuator = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
Future<String> future;
System.out.println("I : " + i);
future = execuator.submit(new ReadTest());
System.out.println(future.get());
future.cancel(true);
}
execuator.shutdownNow();
} catch (Exception ex) {
System.out.println("Error : " + ex);
}
}
}
我正在创建具有限制5的FixedThreadPool。我的循环运行最多10次。 1.这里将创建和使用多少个线程。(根据我的观点,只使用了一个线程,因为我每次都取消未来的对象。这是正确的吗?)
2.i想要执行上面的多个任务for循环。我有使用jsch在shell中执行的命令列表。如何用线程做到这一点?
任何帮助将不胜感激
答案 0 :(得分:1)
您是否尝试运行异步任务,必须在等待时执行其他操作?也许这不是你想要的,但你正在研究java executorservice。这个应用程序使用您正在寻找的异步并发线程吗?
public class ThreadMain {
public static void main(String args[]) {
try {
// start async(threaded) workers
ExecutorService execuator = Executors.newFixedThreadPool(5);
List<Future<String>> workers = new ArrayList<Future<String>>();
for (int idx=0; idx < 10; idx++)
workers.add( execuator.submit(new ReadTest()) );
// loop until all workers is done, results may arrive in random order,
// if none is ready then do something else while waiting for next result.
while(!workers.isEmpty()) {
Future<String> worker=null;
for(int idx=0; idx < workers.size(); idx++) {
worker = workers.get(idx);
if (worker.isDone()) {
worker.remove(idx);
break;
}
worker = null;
}
if (worker==null) {
Thread.sleep(500); // do something else, like idle
} else {
System.out.println("Worker is done with results " + worker.get() );
}
}
execuator.shutdown();
} catch (Exception ex) {
System.out.println("Error : " + ex);
}
}
}