线程池的六种状态和基本使用
线程池的介绍
线程池就是一个容器,里面已经预先存放了很多线程,线程池中的线程具有复用性,可以多次的执行任务.
线程池的基本使用
线程池是一个容器,里面存放了很多线程,里面的线程可以多次执行任务.
线程池相关API:
Executor:接口,是所有线程池的根接口.这个接口提供了提交线程任务的方法.
ExecutorService:是Executor的子接口,也表示线程池.这个接口不仅提供了提交线程任务的方法,还提供了管理线程池的方法.
Eecutors:线程池的工具类,里面提供了获取线程池的方法.
注意:线程池对象不是由我们自己new的,而是要通过工具类Executors进行获取
Executors中获取线程池的方法:
static ExecutorService newFixedThreadPool(int nThreads):获取一个定长的线程池。参数表示线程池的长度。
ExecutorService表示线程池,里面方法:
submit(Runnable task):提交线程任务并执行。
shutdown():销毁线程池
线程池的使用步骤:
1. 通过Executors工具类获取线程池。
2. 调用线程池的submit方法,提交并执行线程任务。
3. 销毁线程池(一般不做)
public class Demo01ThreadPool {
public static void main(String[] args) {
//通过Executors工具类获取线程池。
ExecutorService threadPool = Executors.newFixedThreadPool(2);
//调用线程池的submit方法,提交并执行线程任务。
Task task = new Task();//线程任务对象
threadPool.submit(task);
threadPool.submit(task);
threadPool.submit(task);
//销毁线程池(一般不做)
//threadPool.shutdown();
}
}
public class Task implements Runnable{
//线程要执行的任务
@Override
public void run() {
//输出100次HelloWorld
for (int i = 1; i <= 100; i++) {
System.out.println(Thread.currentThread().getName() + “在输出HelloWorld:” + i);
}
}
}
线程六种状态
线程状态
新建(NEW):刚刚创建出来但是没有运行的线程处于此状态。
运行(RUNNABLE):调用start方法启动后的线程处于运行状态。
受阻塞(BLOCKED):等待获取锁的线程处于此状态。
无限等待(WAITING):当线程调用wait()方法时,线程会处于无限等待状态【没有时间的等待】
计时等待(TIMED_WAITING):当线程调用wait(毫秒值)方法或sleep(毫秒值)时,线程会处于计时等待状态【有时间的等待】
退出(TERMINATED):当线程执行完了自己的run方法或者调用了stop方法,会进入退出状态。
线程状态图
wait和notify介绍
在Object中,有两种方法可以让线程等待以及唤醒线程。
void wait():线程等待,直到其他线程唤醒该线程。
void wait(long timeout):线程等待,直到其他线程唤醒该线程或者指定的时间已到。
void notify():唤醒一个线程。
void notifyAll():唤醒所有线程。
wait用于等待,notify用于唤醒等待的线程,,一般叫做等待唤醒机制,一般用于线程间的通信。
wait和notify方法是Object中的方法,不是Thread中。
注意:
wait和notify一定要写在同步代码中,要通过锁对象调用。
通过哪个锁对象调用的notify方法,唤醒的就是通过哪个锁对象调用wait等待的线程