为什么 FixedThreadPool 不能正常工作
Why FixedThreadPool not working properly
这是我的以下代码:
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(new Runnable() {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Start"+" "+Thread.currentThread().getName());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End!"+" "+Thread.currentThread().getName());
}
}
});
executor.shutdown();
executor.awaitTermination(1, TimeUnit.SECONDS);
这是我的输出:
Start pool-1-thread-1
End! pool-1-thread-1
Start pool-1-thread-1
End! pool-1-thread-1
Start pool-1-thread-1
End! pool-1-thread-1
Start pool-1-thread-1
End! pool-1-thread-1
Start pool-1-thread-1
End! pool-1-thread-1
我的理解是,在我的代码中 FixedThreadPool
中有 5
个线程。所以当我 运行 我的代码时,它应该输出所有 5
线程,对吧?还是我误会了什么?
在我的输出中 thread-1
每次都开始和结束,但是当它在 for
循环中循环时不应该输出所有 5
线程吗?
因为如果只有 1thread
在做 task
那么为什么我们还需要 5 threads
?
有什么方法可以让所有5
个线程都在控制台输出吗?(我是新手)
您只发布了一个 Runnable
,所以您的 ExecutorService
运行了一个任务。它将只使用一个线程。要使用多线程,您必须多次调用 submit
,或者您可以使用 Collection
可运行对象调用 invokeAll
。
编辑
像这样:
public void test() {
int numberOfThreads = 5;
ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads);
for(int i=0; i<numberOfThreads; i++){
executorService.submit(createRunnable());
}
}
private Runnable createRunnable() {
return new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Start" + " " + Thread.currentThread().getName());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End!" + " " + Thread.currentThread().getName());
}
}
};
}
这是我的以下代码:
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(new Runnable() {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Start"+" "+Thread.currentThread().getName());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End!"+" "+Thread.currentThread().getName());
}
}
});
executor.shutdown();
executor.awaitTermination(1, TimeUnit.SECONDS);
这是我的输出:
Start pool-1-thread-1
End! pool-1-thread-1
Start pool-1-thread-1
End! pool-1-thread-1
Start pool-1-thread-1
End! pool-1-thread-1
Start pool-1-thread-1
End! pool-1-thread-1
Start pool-1-thread-1
End! pool-1-thread-1
我的理解是,在我的代码中 FixedThreadPool
中有 5
个线程。所以当我 运行 我的代码时,它应该输出所有 5
线程,对吧?还是我误会了什么?
在我的输出中 thread-1
每次都开始和结束,但是当它在 for
循环中循环时不应该输出所有 5
线程吗?
因为如果只有 1thread
在做 task
那么为什么我们还需要 5 threads
?
有什么方法可以让所有5
个线程都在控制台输出吗?(我是新手)
您只发布了一个 Runnable
,所以您的 ExecutorService
运行了一个任务。它将只使用一个线程。要使用多线程,您必须多次调用 submit
,或者您可以使用 Collection
可运行对象调用 invokeAll
。
编辑
像这样:
public void test() {
int numberOfThreads = 5;
ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads);
for(int i=0; i<numberOfThreads; i++){
executorService.submit(createRunnable());
}
}
private Runnable createRunnable() {
return new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Start" + " " + Thread.currentThread().getName());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End!" + " " + Thread.currentThread().getName());
}
}
};
}