Thread中的方法
start()
用start()
方法来启动线程,真正实现了多线程运行,这时无需等待run()
方法内代码执行完毕,而是直接继续执行下面的代码。通过start()
方法启动一个线程后,线程处于就绪状态,并没有运行,一旦得到CPU时间片,就开始执行run()
方法。
注意:多次
start()
启动一个线程是非法的
run()
run()
称为线程体,它包含了要执行的这个线程的内容,run()
方法运行结束,此线程随即终止。
注意:调用
run()
并不能启动线程
sleep()
sleep()
是一个静态函数,它会使调用线程睡眠一段时间,让其他线程有机会继续执行,但它不释放锁。所以如果有synchronized
同步块,其他线程仍然不能访问共享数据。
注意:使用
sleep()
需要处理异常
join()
使当前线程阻塞,等待调用线程执行完毕后再继续执行。join()
底层通过wait()
实现,关于wait()
详见下文。
注意:
join()
在start()
后调用才有用
yield()
使运行中的线程重新变为就绪状态,让同优先级线程重新竞争。
interrupt()
中断线程,并抛出InterruptException
。
Object中的方法
wait()
wait()
使当前线程阻塞,直到调用notify()
,则被唤醒。
wait(long timeOut)
使当前线程阻塞,直到调用notify()
或时长超过timeOut
,则被唤醒。
注意:
wait()
会释放锁
notify() / notifyAll()
notify()
唤醒单个线程。
notifyAll()
唤醒所有线程。
注意:
wait()
、notify()
、notifyAll()
会对锁进行操作,所以他们必须和synchronized
配合使用。