一个Thread对象是一个用户态线程,对应着一个操作系统内核态线程。一个线程的所有状态:
public void useThreadPool() throws ExecutionException, InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.submit(() -> System.out.println("Executing a Runnable"));
Future<String> result = executor.submit(() -> "Executing a Callable");
System.out.println(result.get());
executor.shutdown();
boolean normallyTerminated = executor.awaitTermination(1, TimeUnit.MINUTES);
System.out.println(normallyTerminated);
}任务提交:
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) { // 线程数量少于corePoolSize
if (addWorker(command, true)) // 添加新工作线程
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) { // 添加任务到workQueue中
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
else if (!addWorker(command, false)) // 若线程数量少于maximumPoolSize,则添加新工作线程
reject(command); // 默认策略下抛出异常拒绝执行
}任务执行:
private Runnable getTask() {
...
for (;;) {
...
try {
Runnable r = timed ?
workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
workQueue.take(); // 从workQueue中拉取任务
if (r != null)
return r;
...
} catch (InterruptedException retry) {
...
}
}
}
final void runWorker(Worker w) {
Runnable task = w.firstTask;
...
try {
while (task != null || (task = getTask()) != null) { // 循环拉取任务
...
try {
beforeExecute(wt, task);
try {
task.run(); // 执行任务
afterExecute(task, null);
} catch (Throwable ex) {
afterExecute(task, ex);
throw ex;
}
} finally {
task = null;
...
}
}
} finally {
processWorkerExit(w, completedAbruptly); // 退出执行,从线程池中移除当前线程
}
}原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。