Java多线程涉及到的方法浅析

在谈多线程中方法的问题之前,我想先说一下”“的概念。
为了解决线程不同步问题(也就是线程执行顺序不可控),Java为用户提供了”锁“的机制来实现线程的同步,锁的机制要求每个线程在进入共享代码前都要取得锁,否则不能进入,而退出共享代码之前则释放该锁。
Java多线程涉及到的方法浅析_第1张图片
1.sleep()
该方法在指定时间内让正在执行的线程暂停执行,但不会释放”锁“标志,使当前进程进入阻塞状态(也就是进入上图的Blocked状态)。
接下来谈一下”不会释放锁标志“的含义:试想程序中有几个线程(假设线程A,B,C)在争抢CPU资源,争取运行的机会,如果某一刻线程A抢到了cpu资源并且运行到了共享代码中,此时线程A取得了进入共享代码的锁,并将其它线程拒之门外,也就是其它线程必须等待,直到线程A退出共享代码并且释放该锁。
假设在共享代码区中出现Thread.sleep(5000)(假设此时还是线程A拿到锁),那么线程A将在此休眠5000毫秒,此时线程B,C即使获得CPU资源也无法执行共享代码,只有等到线程A结束休眠并再次抢得CPU资源将剩余代码执行完毕释放锁后,B,C线程才能正常执行。
2.wait()
wait()方法用于使当前线程放弃临界区而处于休眠状态,直到有另一个线程调用notify()方法将它唤醒或睡眠时间已到为止,其格式如下:

wait();
wait(millis);  //millis是睡眠时间

wait()方法与sleep()方法最大的不同就是wait()方法会释放锁,让其它线程获得执行权。
3.notify()
notify()方法用于将处于睡眠状态的某个等待当前对象监控器的线程唤醒。如果有多个这样的线程,则按照先进先出的原则唤醒第一个线程。
4.yield()
让出当次cpu的执行时间,但马上又到就绪状态。
yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入可执行状态后马上又被执行。
yield()只能使同优先级或者更高优先级的线程有执行的机会。
5.join()
等待调用join()方法的线程结束,再继续执行原线程。
例如:t.join()语句,就是等待线程t运行完毕后,再回到主线程继续执行。

你可能感兴趣的:(java,多线程,线程)