您的位置:首页 > 编程语言 > Java开发

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

2015-10-12 15:42 369 查看
在谈多线程中方法的问题之前,我想先说一下”“的概念。

为了解决线程不同步问题(也就是线程执行顺序不可控),Java为用户提供了”锁“的机制来实现线程的同步,锁的机制要求每个线程在进入共享代码前都要取得锁,否则不能进入,而退出共享代码之前则释放该锁。



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 线程