Skip to content

https://zhuanlan.zhihu.com/p/264797790

Thread的run和start方法有什么不同

当调用 run 方法时,其实是调用当前主程序 main 来执行方法体的; 而调用 start 方法才是真正的创建一个新线程来执行任务。。 区别1:方法性质 调用 start 方法是真正开启一个线程来执行任务, 而调用 run 方法相当于执行普通方法 run,并不会开启新线程 区别二:执行速度 run 方法也叫做线程体,它里面包含了具体要执行的业务代码,当调用 run 方法时,会立即执行 run 方法中的代码(如果当前线程时间片未用完); 而调用 start 方法时,是启动一个线程并将线程的状态设置为就绪状态。也就是说调用 start 方法,并不会立即执行。 区别三:调用次数 因为 run 方法是普通方法,而普通方法是可以被多次调用的,所以 run 方法可以被调用多次; 而 start 方法是创建新线程来执行任务,因为线程只能被创建一次,所以它们的第三个区别是:run 方法可以被调用多次,而 start 方法只能被调用一次。

为什么start()不能调用多次 start 方法之所以不能被重复调用的原因是,线程的状态是不可逆的,Thread 在 start 的实现源码中做了判断,如果线程不是新建状态 NEW,则会抛出非法线程状态异常 IllegalThreadStateException。 还记得线程有哪几种状态吗,状态的转换通过那几个函数呢?

sleep() 方法和 wait() 方法有什么区别和共同点?

不同点:

  1. sleep() 方法没有释放锁,而 wait() 方法释放了锁。
  2. sleep() 方法属于 Thread 类的静态方法,作用于当前线程;
  3. 而 wait() 方法是 Object 类的实例方法,作用于对象本身
  4. 执行 sleep() 方法后,可以通过超时或者调用 interrupt() 方法唤醒休眠中的线程;
  5. 执行 wait() 方法后,通过调用 notify() 或 notifyAll() 方法唤醒等待线程。