1、线程进程介绍:
程序:指令和数据的有序集合,静态概念;
进程:执行程序的一次执行过程,一个动态概念,是系统资源分配的单位;
线程:cpu调度和执行的过程,是独立的执行路径。
他们之间的关系:一个进程可以包含多个线程,至少一个线程。
2、创建线程:
A、继承Thread类,重写run()方法;
B、实现Runnable接口,实现run()方法;
C、实现Callable接口
3、线程状态
大致过程:new一个Thread后线程对象进入了新生状态,当调用start()方法后,线程立即进入了就绪状态,但是并不是一定立即调度执行;调度后进入了运行状态,这时候线程才执行线程内的代码;当运行时调用sleep、wait或同步的锁定时,线程就进入了阻塞状态,只有当阻塞事件解除后重新进入就绪状态等着cpu调度执行。完成所有代码后或者中断那么线程进入死亡状态,无法再次启动此死亡线程。
Java线程的状态有以下几种:
- New:新创建的线程,尚未执行;
- Runnable:运行中的线程,正在执行
run()
方法的Java代码; - Blocked:运行中的线程,因为某些操作被阻塞而挂起;
- Waiting:运行中的线程,因为某些操作在等待中;
- Timed Waiting:运行中的线程,因为执行
sleep()
方法正在计时等待; - Terminated:线程已终止,因为
run()
方法执行完毕。
4、中断线程
A、
B、sleep会使当前线程阻塞;时间到达后进入就绪状态。每一个对象都有一个锁,sleep不会释放锁。
C、Join会合并线程,插入后只有出入的线程执行完成后,才会执行其他线程,其他线程会阻塞。
D、在run()中使用Thread.yield()会使线程执行到此刻礼让,但是不阻塞只是暂停。此刻cpu重新调度,但是礼让不一定成功,取决于cpu再次调度了谁。
5、守护线程
线程有用户线程和守护线程。虚拟机确保用户线程执行完毕,但是不用等待守护线程执行完毕。
在调用start()
方法前,调用setDaemon(true)
把该线程标记为守护线程:
Thread t = new MyThread();
t.setDaemon(true);
t.start();
6、线程优先级
7、线程同步
有两种此关键字用法。
A、synchronized方法
在方法加此关键字
B、synchronize块
比较:
8、lock
9、线程通信
生产者消费者问题