说一下线程中常用的方法
在我们日常开发中线程是必不可少的,那么线程中的方法也就成了面试中的高频问题,决定整理一下;如有错误还请个位指正!
@[toc]
写在前面
线程相关的基本方法有wait(强迫一个线程等待),notify(通知一个线程继续执行),notifyAll(所有线程继续执行),sleep(强迫一个线程睡眠N毫秒),join(等待线程终止),yield(线程让步)等等;
获取和设置线程名称
线程的名字一般在启动前设置,两个名字可以重复但是一般不这样做;
- public final void setName(String name):给线程可以设置线程名称
- public final String getName():获取该线程名称
- public static Thread currentThread():得到正在运行的线程
设置守护线程
守护线程是运行在后台的一种特殊进程,在程序中只要有一个线程在运行,整个程序不会消失,设置一个守护线程即使程序结束,后台仍然会继续执行;在Java中垃圾回收线程就是特殊的守护线程;(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束)
- public final void setDaemon(boolean on):设一个线程是否是一个守护线程 ,参数如果为true守护线程/后台线程
- public
`final
boolean
`isDaemon():判断一个线程是否为守护线程;
join()方法
在线程的操作中加入join()方法(类似于插队)让一个线程强制执行,此线程运行期间其他线程必须等待此线程执行完毕后才可以继续执行(进入就绪再次竞争时间片);
- public final void join():让其他的线程加入到当前线程
sleep()方法
程序中调用sleep方法,可以使得线程暂时休眠;(类似于睡觉,醒来继续竞争)
- public static void sleep(long millis):让该线程休眠millis毫秒
yied()方法
在线程操作中,调用yied()方法可以使当前线程主动放弃时间片,回到就绪状态,竞争下一次时间片;(类似与礼让)
- public static void yield():暂停当前正在执行的线程对象,并执行其他线程。
线程的优先级
Java程序中所有线程在运行之前都会在就绪状态,因此就存在优先级的问题!默认的优先级是5,
- public final void setPriority(int newPriority):更改线程的优先级
- public final int getPriority():获取优先级
优先级都是自定义的常量:
public static final int MAX_PRIORITY 10 :最大优先级
public static final int NORM_PRIORITY 5 :默认优先级
public static final int MIN_PRIORITY 1 :最小优先级
线程停止
当一个线程运行时,另外一个线程可以直接调用interrupt()方法中断其运行状态,也可以是stop()方法;
- public void interrupt():中断线程一种状态(睡眠,其他状态…)
- public final void stop():强迫线程停止执行(虽然过时方法,可以用)
线程唤醒(notify)
Object类中的notify() 方法,唤醒在此对象监视器上等待的单个线程让其继续运行,如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并在对实现做出决定时发生,线程通过调用其中一个wait() 方法,在对象的监视器上等待,直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。类似的方法还有notifyAll() ,唤醒再次监视器上等待的所有线程;
其他方法
- sleep():强迫一个线程睡眠N毫秒;
- isAlive(): 判断一个线程是否存活;
- join(): 等待线程终止;
- activeCount(): 程序中活跃的线程数;
- enumerate(): 枚举程序中的线程;
- currentThread(): 得到当前线程;
- isDaemon(): 一个线程是否为守护线程;
- wait(): 强迫一个线程等待;