我想使用多线程方法编写程序,其中每个线程执行一些IO操作,每个IO操作需要100ms才能完成。我的问题是我想设计我的问题,一旦线程调用IO操作并进入等待状态,线程的其余部分应该开始执行。
这是我最初的实验:
public class TestThread {
public static void main(String args[]) throws InterruptedException {
List<String> list = new ArrayList<>();
ExecutorService executorService = Executors.newFixedThreadPool(10);
for(int i = 0; i < 50; i++) {
Future<String> future = executorService.submit(() -> {
System.out.println(Thread.currentThread().getId());
return getValue();
//here instead of calling getValue(), thread will call some IO operation
//each IO call is indepndent of each other
});
list.add(future.get());
}
}
static String getValue() throws InterruptedException {
if(Thread.currentThread().getId() == 11)
Thread.sleep(10000);
return "some value for the thread " + Thread.currentThread().getId();
}
}
观察到的是: 线程号12等待,直到线程号11完成执行。我想要的是,只要第11号线进入睡眠状态(在实际问题中它将进入IO等待)线程no 12应该开始执行。 请帮我设计一下这个问题。
答案 0 :(得分:0)
线程号12等到线程号11完成执行
这可能是因为您在一个循环中添加了每个任务,您可能认为它将以异步方式触发并忘记,但是您通过调用{{{}来阻止启动过度任务1}}和循环的结束。
future.get()
正在阻塞,因此线程11阻止了线程12的启动。
我建议使用此设计,以避免阻止自己
future.get()
我建议如果IO调用彼此独立,那么为什么鼓励他们互相等待呢?为什么他们会产生任何类型的组合列表?