wait,notify,sleep,join和线程同步问题(续)

2016-02-19 14:15 4 1 收藏

今天图老师小编给大家介绍下wait,notify,sleep,join和线程同步问题(续),平时喜欢wait,notify,sleep,join和线程同步问题(续)的朋友赶紧收藏起来吧!记得点赞哦~

【 tulaoshi.com - 编程语言 】

  昨天没有时间写完这篇,今天补上,前面只说明了wait和notify这两个方法,这里讨论一下sleep和join,说实在的这两个方法比wait和notify简单的多.
  http://blog.csdn.net/treeroot/archive/2004/11/10/175508.ASPx

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  sleep:Thread的静态方法,当前线程休眠一段时间,时间到了再恢复可运行状态,时间到了不一定就执行吧,还得竞争CPU呢.

  join:这个方法其实就是非凡的wait,wait方法一般都需要别人notify(当然也可以设置超时),但是join方法就不需要别人notify了,一直等到这个线程死亡(就相当于这个线程临时前告诉那些在等它的人:你们进来吧!)

  本人不是很会举例子,还是两个人公用一个卫生间吧,这回不刷牙了,改洗澡吧,总不能两个人同时洗澡吧!就算可以,这里假设不可以吧.情况时这样的:A在洗澡,B要等。

  第一种情况:
  B很聪明的,A洗澡可能要20分钟到1小时,我就先睡10分钟看看好了没有,没有好就再睡10分钟,最多多等10分钟而已吧.
  

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

class Syn
  {
          public static void main(String[] args) throws Exception
         {
                 Thread a=new Bathing();
                  a.start();
                  //B
                  int time=0;
                  while(a.isAlive()){
                          Thread.sleep(10000);
                          time+=10;
                          System.out.println("B has waited "+time+" minutes");
                  }
                  System.out.println("B can bath now!");
          }
  }

class Bathing extends Thread
  {
          public void run(){
                  bathing();
          }
          private void bathing() {
                  System.out.println("A is bathing !");
                  try{Thread.sleep(20000);}catch(InterruptedException e){e.printStackTrace();}
                  //延迟20秒看效果
                  System.out.println("A has bathed !");
  

来源:https://www.tulaoshi.com/n/20160219/1606548.html

延伸阅读
在上面的例子中多次使用到了Thread类的join方法。我想大家可能已经猜出来join方法的功能是什么了。对,join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行...
当一个线程进入wait之后,就必须等其他线程notify/notifyall,使用notifyall,可以唤醒 所有处于wait状态的线程,使其重新进入锁的争夺队列中,而notify只能唤醒一个。注意,任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行synchronized 中的代码,notifyall只是让处于wait的线程重新拥有锁的争夺权,但是只会有一个获得锁并执行...
标签: Delphi
  在编写多线程应用程序时,最重要的是控制好线程间的同步资源访问,以保证线程的安全运行。Win 32 API提供了一组同步对象,如:信号灯(Semaphore)、互斥(Mutex)、临界区(CriticalSection)和事件(Event)等,用来解决这个问题。 Delphi分别将事件对象和临界区对象封装为Tevent对象和TcritialSection对象,使得这两...
/**  * pTitle: 线程同步/p  * pDescription: 通过使用同步锁实现对共享数据的操作/p  * pCopyright: Copyright (c) 2003/p  * pFilename: SyThreadDemo.java/p  * @version 1.0  */ /**  *br类说明:主程序  *br功能描述:构造两个线程,并启动它们  */ public class SyThreadDemo {  ...
什么是线程同步? 当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题。 实现同步机制有两个方法 : 1。同步代码块: synchronized(同一个数据){} 同一个数据:就是N条线程同时访问一个数据。 2。 同步方法: public synchronized 数据返回...

经验教程

114

收藏

47
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部