Java多线程相关方法详解

时间:2022-11-05 17:29:57

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配合使用。