sleep()和wait()的区别
共同点:两者都可以暂停线程
区别:
- sleep()没有释放线程锁;而wait()释放了线程锁
- wait()通常用于线程间的交互/通信,而sleep通常用于暂停执行
- wait()调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者notifyAll()方法。sleep()执行完成后,线程会自动苏醒,或者也可以使用wait(long timeout)超时后线程会自动苏醒
- sleep()是Thread类的静态方法,wait()则是Object类的本地方法。
为什么wait()不定义在Thread类中
wait()是让获得对象锁的线程等待,会自动释放当前线程占用的对象锁。
每个Object对象都有对象锁,既然要释放当前线程占有的对象锁并让其进入WAITING状态,自然要操作对应的对象而不是当前的线程。
为什么sleep()定义在Thread类中
sleep()是让当前线程暂停执行,不涉及对象类,也不需要获取对象锁。
可以直接调用Thread类的run方法吗?
new一个Thread对象,线程就进入新建状态了;
调用start(),会启动一个线程并使其进入就绪状态,当分配的时间片到了就可以开始运行了;
start()会执行线程的相应准备工作,然后自动执行run()的内容,这是真正的多线程工作。
如果直接调用run(),会把run()当成是一个main线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。
总结:
调用start()方法方可启动线程并使其进入就绪状态,执行run()方法的话不会以多线程的方式执行。