Thread 生命周期
线程类提供的状态如下:
Thread.State.BLOCKED;
Thread.State.NEW; // 新建态,没有开启线程
Thread.State.RUNNABLE; // 就绪态和运行态
Thread.State.TERMINATED; // 消亡(结束)态
Thread.State.TIMED_WAITING; // 阻塞态调用了有时间限制的wait方法、sleep方法)
Thread.State.WAITING; // 阻塞态(调用了wait方法,等待其他线程唤醒的状态)
// 从诞生,到活跃状态,再到最后的消亡状态
//线程中关于状态的描述
Thread thread = new Thread() { //匿名创建线程
@Override
public void run() {
String s1 = "";
for (int i = 0; i < 10; i++) {
s1+=i;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
System.out.println(thread.getState()); //新建状态
thread.start(); //开启线程
while (true) {
System.out.println(thread.getState()); //运行状态 //也会出现阻塞状态
if (thread.getState().equals(Thread.State.TERMINATED)) { //当状态等于消亡状态时
System.out.println(thread.getState()); //打印消亡状态
break; //结束
}
}
thread.getState();
// Thread.State.BLOCKED;
// Thread.State.NEW; //新建态,没有开启线程
// Thread.State.RUNNABLE; //就绪态和运行态
// Thread.State.TERMINATED; //消亡(结束)态
// Thread.State.TIMED_WAITING; //阻塞态调用了有时间限制的wait方法、sleep方法)
// Thread.State.WAITING; //阻塞态(调用了wait方法,等待其他线程唤醒的状态)
线程池
没有线程池的状态:
当我们使用一条线程的时候,先将线程对象创建出来,启动线程,在运行过程中,可能能完成任务,也可能会在中途被任务内容中断掉,任务还没有完成。
即使是能够正常完成,线程对象就结束了,就变成了垃圾对象,需要被垃圾回收器回收
如果在系统中,大量的任务都是小任务,任务消耗时间较短、线程对象的创建和消亡耗费的时间
比较多,结果:大部分的时间都浪费在了线程对象的创建和死亡上。
如果任务本身破坏力比较大,可能会把线程对象结束掉,就无法继续完成任务。
有线程池的状态:
在没有任务的时候,先把线程对象准备好,存储到一个容器中,一旦有任务来的时候,就不需要
创建对象,而是直接将对象获取出来执行任务
如果任务破坏力较小,任务可以直接完成,这个线程对象不会进入死亡状态,而是被容器回收,继续活跃。
如果任务破坏力较大,任务会把线程搞死,线程池会继续提供下一个线程,继续完成这个任务。
创建线程池
//工具类:Executors:生成线程池的工具类,根据需求生成指定大小的线程池
//创建线程池
ExecutorService es = Executors.newSingleThreadExecutor(); //创建单线程的线程池
ExecutorService es2 = Executors.newFixedThreadPool(5); //创建五个线程的线程池
// ExecutorService:是一个接口,不需要手动创建这个接口的实现类对象,使用方法获取到的
// 就是这个接口的实现类对象,一定可以调用这个接口中的方法
// 创建任务类对象:Runnable的实现类对象,用于定义任务内容
Runnable r1 = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 50; i++) {
System.out.println(i);
}
}
};
Runnable r2 = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 100; i < 150; i++) {
System.out.println(i);
}
}
};
Runnable r3 = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 150; i < 200; i++) {
System.out.println(i);
}
}
};
es2.submit(r1); //submit(runnable r)直接将任务对象写入 线程池会自动处理 不需要start
es2.submit(r2);
es2.submit(r3);
es2.shutdown(); //结束线程池 将已经提交的全部做完并不允许再提交
es2.shutdownNow(); //结束线程池 已经开始的保证做完,但没有开始的已经提交的不再处理