线程
线程是进程中的一个实体
是被系统独立调度和分配的基本单位
一个标准的线程:
- 线程ID,
- 当前指令指针(PC)
- 寄存器集合
- 堆栈
Java默认线程有两个:
线程状态
之前线程的状态
(1)新建状态(New):当线程对象对创建后,即进入了新建状态
(2)就绪状态(Runnable):当调用线程对象的start()方法,线程即进入就绪状态
(3)运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,,执行run()方法
(4)阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行
(5)死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
在Java中
在Thread.state源码来看 线程状态有6种
1 | public enum State {状态 |
1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
2.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池 中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU 时间片后变为运行中状态(running)。
3.阻塞(BLOCKED):表示线程阻塞于锁。
4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5.超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。6.终止(TERMINATED):表示该线程已经执行完毕。
Java无法开启一个线程: 通过调用本地方法来开启的
1 | private native void start0(); |
多线程
实现Runnable接口,实现Callable和继承Thread可以得到一个线程类
为什么使用多线程?
为了解决负载均衡问题,充分利用单核的CPU资源.为了提高CPU的使用率,
继承Thread方式
1 | class ThreadTest extends Thread { // 线程主体 |
1 | public static void main(String[] args) { |
结果:
线程A–继承Thread类似创建线程
线程B–继承Thread类似创建线程
线程C–继承Thread类似创建线程
线程B–继承Thread类似创建线程
线程A–继承Thread类似创建线程
线程B–继承Thread类似创建线程
线程C–继承Thread类似创建线程
线程A–继承Thread类似创建线程
线程C–继承Thread类似创建线程
实现Runable接口方式
1 | class RunableTest implements Runnable {// 线程主体 |
1 | public static void main(String[] args) { |
结果:
Runable-aa–实现Runable类似创建线程
Runable-cc–实现Runable类似创建线程
Runable-bb–实现Runable类似创建线程
Runable-cc–实现Runable类似创建线程
Runable-aa–实现Runable类似创建线程
Runable-cc–实现Runable类似创建线程
Runable-bb–实现Runable类似创建线程
Runable-bb–实现Runable类似创建线程
Runable-aa–实现Runable类似创建线程
实现Callable方式
1 | class CallableTest implements Callable<String> { |
1 | public static void main(String[] args) throws Exception { |
结果:
name:0
name:0
name:0
name:1
name:1
name:2
name:1
name:2
name:2
ft1:测试结束
ft2:测试结束
ft3:测试结束
Runable与Callable区别:
不同点
Runnable没有返回值;Callable可以返回执行结果,是个泛型,和Future、FutureTask配合可以用来获取异步执行的结果
Callable接口的call()方法允许抛出异常;Runnable的run()方法异常只能在内部消化,不能往上继续抛
注:Callalble接口支持返回执行结果,需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞。
关键字
Sleep
Thread.sleep(2000); 表示当前线程暂停1000毫秒 ,其他线程不受影响
Thread.sleep(2000); 会抛出InterruptedException 中断异常
1 |
|
Join
t3.join(3000); 3秒
把某一下线程加入到主线程,表示只有等该线程执行完成才继续运行其他线程
1 | public static void main(String[] args) throws Exception { |
setPriority
线程优先级
1 | // 优先级最高 |
yield
临时暂停
1 | t3.yield(); |
setDaemon
守护线程
t1.setDaemon(true);设置当前线程为守护进程
1 | t1.setDaemon(true); |
小唠嗑:
想更加深入的了解多线程的使用,进看《Java中级_多线程二》篇
本章到这里就结束了,谢谢耐心看到这里的各位Boss,如果觉得有哪里说的不好的地方,还请高抬贵手多多原谅,不惜指教。
最后,谢谢!