对Thread的理解,也可以理解为什么是Thread?他能做什么?
- 线程是CPU调度的基本单位,一个进程可以有多个线程
在java中线程有四种实现方式
- 继承或者创建Thread类 并实现run方法;
- 实现Ranable接口,实现接口中run方法;
- 实现Callabe接口,通过FutureTask包装器来创建Thread线程
Callable<V> oneCallable = new SomeCallable<V>(); //由Callable<Integer>创建一个FutureTask<Integer>对象: FutureTask<V> oneTask = new FutureTask<V>(oneCallable); //注释:FutureTask<Integer>是一个包装器,它通过接受Callable<Integer>来创建,它同时实现了Future和Runnable接口。 //由FutureTask<Integer>创建一个Thread对象: Thread oneThread = new Thread(oneTask); oneThread.start(); //至此,一个线程就创建完成了。
- 通过线程池创建线程
既然你说到了线程池,来讲讲线程池有几种?他们的区别是什么?
什么是线程池?
线程池就是创建多个线程并且进行管理的容器。
线程池一共有四种
- fixedThreadPool()启动固定线程数的线程池
- CachedThreadPool()按需分配的线程池
- ScheduledThreadPool()定时定期执行任务的线程池
- ThreadPoolExecutor()指定线程数的线程池
Thread的运行状态
- 创建new (new Thread)
- 就绪runnable (创建后run方法之前的时候)
- 运行running (获得CPU执行时间 run方法中)
- 阻塞block(被同步代码块,或者IO阻塞,想要获取锁的时候,阻塞)
- 睡眠time waiting(sleep方法调用 睡眠时间已满或者被notify唤醒)
- 等待waiting (等待另一个线程调度器唤醒的状态,例如Object.wait()、Thread.join()、Lock.await()、Lock.lock())
阻塞和运行的区别
- 阻塞不持有锁(等待获取对象的锁释放)而 运行状态持有锁(加锁在运行)。
- 阻塞不持有CPU的时间片,运行持有。