相关资讯
本类常用软件
-
福建农村信用社手机银行客户端下载下载量:584204
-
Windows优化大师下载量:416898
-
90美女秀(视频聊天软件)下载量:366961
-
广西农村信用社手机银行客户端下载下载量:365699
-
快播手机版下载量:325855
sleep是让线程暂停指定的时间,wait是让线程等待,知道有notify方法出现在继续运行,sleep不释放对象锁,wait释放对象锁。这在很多地方都有写到,但没有例子不好理解
import java.util.ArrayList; import java.util.List; public class thread { public List list=new ArrayList(); Integer i=0;//新建一个对象,随便什么,就为了借用它的锁而已。 public static void main(String[] args){ thread th=new thread(); A a=th.new A(); B b=th.new B(); Thread add=new Thread(a); Thread get=new Thread(b); add.start(); get.start(); } class A extends Thread{ public void run(){ synchronized(i){ try { //Thread.sleep(1000); i.wait();//这里调用了对象i的wait方法,那么就表示所在线程暂时放弃i的对象锁,并阻塞在这里,同时把机会让给同样使用i锁的B线程执行 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for(int j=0;j
从如上代码中可见,线程B是负责向集合中加值的,线程A是负责从集合中取值的,如果不进行同步处理,那么如果两个线程同时运行,那么A可能在B加入值之前就从集合中取值,那么就会报错,所以必须进行同步代码的操作(也可以加入flag来判断是否到了A中从集合里取值的时机)。
而用sleep就没有上面的功能了,因为从代码中可以发现,不管是A线程先抢到cpu开始执行还是B线程先执行,他们中的一个肯定会拿到i的锁的,但拿到后i的锁就没有使用wait方法释放过,那假设B先拿到锁了,向list中加入值完成了,那也别指望A能打印出来,因为A一直阻塞在(i){