`
king_tt
  • 浏览: 2113567 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java中的对象Object方法之---wait()和notifiy()

 
阅读更多

上一篇说到了suspend()和resume()方法,这一篇咋们继续,接着来介绍wait()和notify()方法,我们都知道这两个方法和之前介绍的方法不太一样,那就是这两个方法是对象Object上的,不属于Thread类上的。我们也知道这两个方法是实现多个线程之间的通信和互斥的,不多说了,下面就来看一下例子吧:

例子描述:

开启两个线程,子线程循环10次,主线程循环100次,如此反复循环50次

代码如下:

  1. packagecn.itcast.heima;
  2. publicclassTraditionalThreadCommunication{
  3. publicstaticvoidmain(String[]args){
  4. finalBusinessbusiness=newBusiness();
  5. //子线程循环10次
  6. newThread(newRunnable(){
  7. @Override
  8. publicvoidrun(){
  9. for(inti=0;i<50;i++){
  10. business.sub(i);
  11. }
  12. }
  13. }).start();
  14. //主线程循环100次
  15. for(inti=0;i<50;i++){
  16. business.main(i);
  17. }
  18. }
  19. /**
  20. *业务逻辑类
  21. *@authorweijiang204321
  22. *
  23. */
  24. staticclassBusiness{
  25. privatebooleanbShouldSub=true;//true表示sub执行,false表示main执行
  26. publicsynchronizedvoidsub(inti){
  27. //将这里的if改成while,效果更好,while会再次判断,安全性高
  28. //因为有时候线程可能被假唤醒
  29. while(!bShouldSub){
  30. try{
  31. //等待
  32. this.wait();
  33. }catch(InterruptedExceptione){
  34. e.printStackTrace();
  35. }
  36. }
  37. for(intj=0;j<=10;j++){
  38. System.out.println("subthreadsequeceof"+j+",loopof"+i);
  39. }
  40. bShouldSub=false;
  41. this.notify();//唤醒该锁的等待线程
  42. }
  43. publicsynchronizedvoidmain(inti){
  44. while(bShouldSub){
  45. try{
  46. this.wait();
  47. }catch(InterruptedExceptione){
  48. e.printStackTrace();
  49. }
  50. }
  51. for(intj=0;j<=100;j++){
  52. System.out.println("mainthreadsequeceof"+j+",loopof"+i);
  53. }
  54. bShouldSub=true;
  55. this.notify();
  56. }
  57. }
  58. }
通过wait和notify机制来实现这两个线程的循环的有序性,能够保证子线程循环10次,主线程循环100次这样交替运行。

运行结果很多,这里就不截图了!这里我们也是可以看到的,调用wait方法是会释放锁的,所以他会被用到很多,这个和之前的几个方法是不同的!


注意的两点:

第一:同步代码块中的锁和调用wait和notifiy方法的对象锁一定要是同一个。

第二:wait和notify方法的调用一定要在同步代码块中,不然会报异常,可以自行测试一下。


不要因为这样就结束了,这一篇还不是最终篇,等待下一篇吧!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics