Java并发编程
前言
总结一下Java并发中线程常用的方法
一、常用方法总结
方法名 | static | 功能说明 | 备注 |
---|---|---|---|
start() | 启动一个新线程,并在新的线程执行run() | start()方法只是让线程进入就绪状态,能否立刻执行需要看cpu是否分时间片给它,每个线程对象的start()只能调用一次,调用多次则会出现IllegalThreadStateException | |
run() | 新启动的线程会调用的方法 | ||
join() | 等待线程运行结束 | ||
join(long n) | 等待线程运行结束,最多等待n毫秒 | ||
getId() | 获取线程长整型id | id唯一 | |
getName() | 获取线程名 | ||
setName(String) | 修改线程名 | ||
getPriority() | 获取线程优先级 | ||
setPriority(int) | 修改线程优先级 | Java中规定线程优先级是1-10的整数,较大的优先级能提高该线程被CPU调度的几率 | |
getState() | 获取线程状态 | Java中线程状态是用6个enum表示,分别是:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED | |
isInterrupted() | 判断是否被打断 | 不会清楚打断标记 | |
isAlive() | 线程是否存活(还没有运行完毕) | ||
interrupt() | 打断线程 | 如果被打断线程正在sleep、wait、join会导致被打断的线程抛出InterruptedException,并清除打断标记;如果打断的正在运行的线程,则会设置打断标记;park的线程被打断,也会设置打断标记 | |
interrupted() | static | 判断当前线程是否被打断 | 会清楚打断标记 |
currentThread() | static | 获取当前正在执行的线程 | |
sleep(long n) | static | 让当前执行的线程休眠n毫秒,休眠时让出cpu的时间片给其他线程 | |
yield() | static | 提示线程调度器让出当前线程对CPU的使用 |
二、常用方法对比
- sleep() 和 wait()
1、sleep()方法属于Thread类的static方法,wait()方法属于Object类,任何对象都可以使用
2、sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者(不会释放锁,进入Timed_Waiting状态),当指定的时间到了又会自动恢复运行状态;wait()方法会使线程放弃对象锁,只有针对此对象调用notify()或notifyAll()方法后,重新获得对象锁资源后才能继续执行
3、sleep()和wait()都可以被interrupted()方法打断
wati | sleep | |
---|---|---|
同步 | 只能在同步上下文中调用wait方法,否则会抛出IllegalMonitorStateException异常 | 不需要在同步方法或同步块中调用 |
作用对象 | wait方法定义在Object类中,作用于对象本身 | sleep定义在java.lang.Thread中,作用于当前线程 |
释放锁对象 | 是 | 否 |
唤醒条件 | 其他线程调用对象的notify()或者notifyAll()方法 | 超时或者调用interrupt() |
方法属性 | wait是实例方法 | sleep是静态方法 |