线程相关的基本方法有:wait、notify、notifyAll、sleep、join、yield等。
线程等待(wait):调用此方法的线程进入WAITING状态,只有等待其他线程的通知或中断才会返回。需要注意的是,在调用WAIT()方法后,对象的锁将被释放。因此,wait方法通常用于同步方法或同步代码。
线程睡眠(sleep):sleep导致当前线程休眠,不同于wait方法,sleep不会释放当前占有的锁,sleep(long)线程将进入TIMED-WAITING状态,而WAIT()方法将导致当前线程进入WAITING状态。
线程让步(yield):yield将使当前线程放弃CPU执行时间片,并与其他线程重新竞争CPU时间片。一般来说,优先级高的线程更有可能成功竞争CPU时间片,但这不是绝对的。一些操作系统对线程优先级不敏感。
线程中断(interrupt):中断线程的初衷是给线程一个通知信号,这将影响线程内部的中断标志位。线程本身不会改变状态(如堵塞、终止等)。
1.调用interrupt()的方法不会中断正在运行的线程。也就是说,处于Running状态的线程不会因为中断而终止,只会改变内部维护的中断标志。
2.如果调用sleep()使线程处于TIMED-WAITING状态,则调用interupt()方法将抛出interuptedException,使线程提前结束TIMED-WAITING状态。
3.许多声明抛出InterruptedException的方法(例如Thread).sleep(long mills方法))。在抛出异常之前,中断标志位将被清除,因此在抛出异常后,调用isinterrupted()方法将返回false。
4.中断状态是线程固有的标志位,可以通过该标志位安全终止线程。例如,当您想终止一个线程thread时,可以调用thread.interrupt()方法,根据thread,可以在线程run方法内部使用.isInterrupted()优雅的终止线程值。
join等待其他线程终止:join方法等待其他线程终止。如果在当前线程中调用一个线程join()方法,当前线程将转换为阻塞状态,返回另一个线程结束,当前线程将从阻塞状态转变为就绪状态,等待CPU的青睐。
为什么要使用join()方法?在许多情况下,主线程生成并启动子线程,需要使用子线程返回的结果,即主线程需要在子线程结束后结束,然后使用join()方法。
线程唤醒(notify):Object类中的notify()方法唤醒了在这个对象监视器上等待的单个线程。如果所有线程都在这个对象上等待,则会选择唤醒其中一个线程。选择是任意的,当实现做出决定时,线程会通过调用其中一个wait()方法在对象监视器上等待,直到当前线程放弃对象上的锁定。为了继续执行被唤醒的线程,被唤醒的线程将以常规的方式与所有其他主动同步的线程竞争。还有notifyAll()类似的方法来唤醒在这个监听器上等待的所有线程。
其他方法:
1.sleep():强迫线程睡眠N毫秒。
2.isAlive():判断一个线程是否存活
3.join():等待线程终止
4.activeCount(): 程序中活跃的线程数
5.enumerate(): 枚举程序中的线程
6.currentThread() :获取当前线程
7.isDaemon(): 一个线程是否是守护线程?
8.setDaemon():设置一个线程作为保护线程。
9.setName():为线程设置名称
10.wait() :强迫一个线程等待
11.notify(): 通知一个线程继续运行
12.notifyAll(): 通知一些线程继续运行
13.setPriority(): 设置线程的优先级
14.getPriority(): 获得线程优先级