学习内容:
1、 补充创建线程的方式
2、 线程的生命周期
3、 线程的常用方法
线程的创建
第四种创建线程的方法:线程池
Executors是提供着四种线程池
可缓存线程池
newCachedThreadPool
public class ThreadPoolDemo1 {
public static void main(String[] args) {
//newCachedThreadPool线程池会循环调用,线程池长度超过处理需要,可自己灵活回收空闲线程然后在调用,若没有可回收的线程在进行创建。
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 100; i++) {
int num = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("threadName"+Thread.currentThread().getName()+",i="+num);
}
});
}
}
}
定长线程池
newFixedThreadPool
public class ThreadPoolDemo2 {
public static void main(String[] args) {
//newFixedThreadPool线程池是点定义了最大的并发数量,超出的部分需要等待
ExecutorService executorService = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) {
int num = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("threadName"+Thread.currentThread().getName()+",i="+num);
}
});
}
}
}
定长线程池,支持定时及周期性任务执行
newScheduledThreadPool
public class ThreadPoolDemo3 {
public static void main(String[] args) {
//定时线程池newScheduledThreadPool也可以定义控制线程最大的并发数量
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
for (int i = 0; i < 10; i++) {
int num = i;
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
System.out.println("threadName"+Thread.currentThread().getName()+",i="+num);
}
//前面的参数是填写的多少秒后开始执行线程,后面的是秒的时间单位,一般是毫秒这样设置后就是秒
},5,TimeUnit.SECONDS);
}
}
}
单线程化的线程池
newSingleThreadExecutor
public class ThreadPoolDemo4 {
public static void main(String[] args) {
//newSingleThreadExecutor只用一个工作线程可以完全按照顺序进行
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
int num = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("threadName"+Thread.currentThread().getName()+",i="+num);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
executorService.shutdown();
}
}
线程的生命周期
线程的生命周期分为五个状态
-
新建 NEW
-
准备/就绪 START
-
运行 RUNNING
-
阻塞 BLOCKING
-
死亡 DEAD
下面放一个流程图让你们更好的去理解

线程的常用方法
| 方法 | 介绍 |
|---|---|
| start() | 启动 |
| stop() | 停止(禁用,可能导致线程死锁等问题),停止线程可以让run执行结束 |
| String getName() | 获得线程的名字 |
| setName(String) | 设置线程名字 |
| sleep(long) | 进入睡眠,毫秒 |
| setPriority(int) | 设置线程的优先级(1~10从低到高)越高抢CPU几率更高 |
| setDaemon(boolean) | 设置为后台线程 true ,后台线程是为其它线程服务的,如果没有其它线程存在,就自动死亡;使用案例:GC就是一种后台线程 |
| join() | 线程的加入(合并)让其它线程先执行完,再执行自己的指令 |
本文介绍了Java中线程池的四种类型:可缓存线程池、定长线程池、定时及周期性任务执行的线程池和单线程池,并详细阐述了线程的生命周期,包括新建、就绪、运行、阻塞和死亡五个状态,帮助开发者更好地理解和使用线程。
169万+





