java多线程编程系列-基础2-线程sleep()和wait()的使用和区别

我们在平时在学习的过程中都会看到sleep()和wait()的使用。

sleep()表示的是睡觉,就是按时间的不执行,然后时间到了就可以执行了。(当然也也可以被中断的)。

wait()也表示睡觉,但是是睡觉的等等,别人不叫醒他,它就睡觉下去了。

理解深点的,sleep()用的时候,是不释放对象锁的,而wait()是释放对象锁。这也是为了理解写本笔记的原因。

下面请看:

有一个公共资源类,两个线程都去调用这个类的一个方法,然后再man方法中进行测试。

首先我们来看使用wait()方法:

Resource类

package enduak;  
  
public class Resoure {  
  
    public synchronized void printMsg (String msg) {  
          
        System.out.println(msg);  
          
        if (msg.equals("chenwei")) {  
            try {  
                <strong>Thread.sleep(10000) ;</strong>  
            } catch (InterruptedException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
          
        System.out.println("-----");  
          
          
    }          
}  

 线程1

package enduak;  
  
public class Thread1 extends Thread{  
  
    private Resoure res = null;  
      
    public Thread1(Resoure res) {  
          
        this.res = res ;  
    }  
      
    public void run() {  
          
        res.printMsg("chenwei") ;  
  
    }  
}   

线程2     

package enduak;  
  
public class Thread2 extends Thread{  
  
    private Resoure res = null;  
      
    public Thread2(Resoure res) {  
          
        this.res = res ;  
    }  
      
    public void run() {  
          
        try {  
            Thread.sleep(1000) ;  
        } catch (InterruptedException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        res.printMsg("chenweix") ;  
          
          
    }  
}  

main测试类

package enduak;  
  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
  
public class MainApp {  
  
    public static void main(String[] args) {  
          
        ExecutorService es = Executors.newCachedThreadPool() ;  
        Resoure res = new Resoure();  
        Thread1 t1 = new Thread1(res ) ;  
        Thread2 t2 = new Thread2(res) ;  
          
        es.execute(t1) ;  
        es.execute(t2) ;  
          
    }  
      
}  

测试结果分析:

chenwei (等了好久,才打印出下面的)  
-----  
chenweix  
-----  

当使用sleep()的时候,线程是占用着资源的,其他的线程是不能用这个资源的,也就是说我们说的不释放对象锁的。

-------------------------------------------------

而当我们用wait()的方法的时候:

resource类

package enduak;  
  
public class Resoure {  
  
    public synchronized void printMsg (String msg) {  
          
        System.out.println(msg);  
          
        if (msg.equals("chenwei")) {  
            try {  
                <strong>this.wait() ;</strong>  
            } catch (InterruptedException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
          
        System.out.println("-----");          
          
    }  
      
}  

打印结果:

chenwei  
chenweix  
-----  

线程还在那里等待着,释放掉了对象锁,其他的线程也可以使用对象的方法了的

转载于:http://endual.iteye.com/blog/1415271

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值