java中wait 和 sleep 区别

来源:互联网 发布:mac版百度云好友分享 编辑:程序博客网 时间:2024/05/22 03:25
1,wait可以指定时间也可以不指定。
   sleep必须指定时间。


2,在同步中时,对cpu的执行权和锁的处理不同。
wait:释放执行权,释放锁。

sleep:释放执行权,不释放锁。

那抹举个例子说明,相信大家会很快明白:

public class Test1 {public static void main(String[] args) {MyThread m1 = new MyThread("线程1");MyThread m2 = new MyThread("线程2");m2.start();m1.start();}}class MyThread extends Thread {String name;public MyThread(String name) {this.name = name;}@Overridepublic void run() {synchronized (Test1.class) {try {System.out.println(name);sleep(5000);System.out.println(name);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

她的输出结果永远都是成双成对出现;

比如:

线程2

线程2

线程1

线程1;

而永远不会出现

线程1

线程2。。。

因为两个线程用的是同一个锁,

而sleep是不会释放锁的;

下面来看第二个例子

public class Test1 {public static void main(String[] args) {MyThread m1 = new MyThread("线程1");MyThread1 m2 = new MyThread1("线程2");m2.start();m1.start();}}class MyThread extends Thread {String name;public MyThread(String name) {this.name = name;}@Overridepublic void run() {synchronized (Test1.class) {System.out.println(name);try {Test1.class.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(name);}}}class MyThread1 extends Thread {String name;public MyThread1(String name) {this.name = name;}@Overridepublic void run() {synchronized (Test1.class) {System.out.println(name);try {Test1.class.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(name);}}}

这与第一个例子正好相反,她永远都不会出现成双成对的情况

这是由于,wait会释放锁


0 0
原创粉丝点击