1.线程状态:
(1)创建(new)状态: 准备好了一个多线程的对象,即执行了new Thread(); 创建完成后就需要为线程分配内存
(2)就绪(runnable)状态: 调用了start()方法, 等待CPU进行调度
(3)阻塞(blocked)状态: 暂时停止执行线程,将线程挂起(sleep()、wait()、join()、没有获取到锁都会使线程阻塞), 可能将资源交给其它线程使用
(4)死亡(terminated)状态: 线程销毁(正常执行完毕、发生异常或者被打断interrupt()都会导致线程终止
(5)运行(running)状态: 执行了run()方法的线程
2.线程常用方法
(1)获取线程各种参数
currentThread( ):获取当前执行的线程;
getName( ):获取线程名字;
getId( ):获取线程id;
isAlive():判断线程是否存活,线程处于正在运行,获取准备开始运行的状态,就认为是存活状态
getPriority( ):获取线程优先级
isDaemon( ):查看是否是守护线程
关键词解释:守护线程,是指在程序运行时 在后台提供一种通用服务的线程,这种线程并不属于程序中不可或缺的部分。通俗点讲,任何一个守护线程都是整个JVM中所有非守护线程的"保姆"。只有到JVM中还有非守护线程时,守护线程就不会结束,反之则结束。例如垃圾回收器就是守护线程
(2)start()和run()
start( ):启动并发编程,通过cpu的轮转调度来启动线程·,实现多线程。
run( ):启动顺序编程,只启动调用run方法的主线程
(3)sleep() 与 interrupt()
sleep( ):睡眠指定时间,释放cpu的执行权,但是不会释放锁,所以一旦时间到了就会立即执行。由运行状态转变为阻塞状态
interrupt( ):唤醒正在睡眠的程序,调用interrupt()方法,会使得sleep()方法InterruptedException异常,当sleep()方法抛出异常就中断了sleep的方法,从而让程序继续运行下去,由阻塞状态变为运行状态。
(4)wait() 与 notify() {同步代码块内部方法}
wait( ):等待指定时间,释放cpu,释放锁。时间到了之后就会进入就绪状态重新获取锁。
notify():唤醒由wait暂停执行的线程,但不会立即执行,而是使其从等待队列进入就绪状态重新获取锁,
notifyAll(): 唤醒所有的wait对象
(5)sleep()与 wait()
sleep()
方法是Thread
类中的一个静态方法,用于使当前线程暂停执行一段时间。它接受一个以毫秒为单位的时间参数,并且可以抛出InterruptedException
异常。当调用sleep()
方法时,当前线程会进入阻塞状态,并释放CPU资源,让其他线程有机会执行。经过指定的时间后,线程会被唤醒,继续执行。
wait()
方法是Object
类中的一个实例方法,用于使当前线程进入等待状态,直到其他线程调用该对象的notify()
或notifyAll()
方法唤醒它,或者等待一定时间后自动唤醒。在调用wait()
方法之前,必须先获得对象的锁(即在synchronized
块中调用)。当调用wait()
方法时,当前线程会释放对象的锁,并进入等待状态,同时让出CPU资源,让其他线程有机会执行。
总结:sleep属于Thread类静态方法,不会释放锁。sleep使用interrupt()来唤醒
wait属于Object类实例方法,只能在synchronized中使用,会释放锁,调用wait之前也要获取锁,
sleep使用interrupt()来唤醒
(6)join()
让调用join方法的当前线程加入主线程,然后父线程会一直wait,直到子线程执行完毕,一般用在前置线程上。