- 要执行的任务runnable、驱动任务执行的线程thread。thread自身不执行任何操作,只是驱动赋予它的任务。
new Thread(new Task()).start()
Executor执行器管理线程,允许管理异步任务的执行,无须显式管理线程的生命周期,其有多种类型。
Executors.newCachedThreadPool();为每个任务创建一个线程,每个任务分配一次线程开销
Executors.newFixedThreadPool(num);预先一次性进行线程分配,一次线程分配开销
Executors.newSinleThreadExecutor();序列化提交的任务,线程数为1
public class Liftoff implements Runnable {
@Override public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("hello " + i);
Thread.yield();
} }
}
public class TestParallel {
public static void main(String[] args) {
ExecutorService executor = Executors.newCachedThreadPool( );//替换不同Executor结果不同
for (int i = 0; i < 2; i++) {
executor.execute(new Liftoff());
String threadName = Thread.currentThread().getName();
System.out.println("Hello " + threadName);
}
executor.shutdown();
}
}
- 不同执行器结果展示
SingleThreadExecutor:main 0 main 1 2 0 1 2
FixedThreadPool:0 main 1 2 main 0 1 2
CachedThreadPool:main 0 1 2 main 0 1 2
- 任务产生方式:
runnable无返回值,对应run()
Callable允许返回值和异常,对应call()
- 优先级
常用优先级类型:MAX_PRIORITY 、MIN_PRIORITY 、 NORM_PRIORITY
- yield和sleep
yield向线程调度器暗示工作已完成差不多,可以让其他线程使用CPU了,也是在建议具有相同优先级的其他线程可以运行
- 后台线程daemon
指程序运行时后台提供的一种通用服务的线程,这种线程不属于程序中不可或缺的部分。非后台线程结束时,程序也就终止,同时杀死进程中所有后台进程。
在线程启动之前调用setDaemon()才能把他设置为后台线程