如果将来在循环中,Java中的ExecutorService如何表现

时间:2014-07-17 04:56:59

标签: java multithreading

我是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中执行的命令列表。如何用线程做到这一点?

任何帮助将不胜感激

1 个答案:

答案 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);
        }
    }

}