1,wait可以指定时间也可以不指定。
sleep必须指定时间。
2,在同步中时,对cpu的执行权和锁的处理不同。
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;
}
@Override
public void run() {
synchronized (Test1.class) {
try {
System.out.println(name);
sleep(5000);
System.out.println(name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.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;
}
@Override
public void run() {
synchronized (Test1.class) {
System.out.println(name);
try {
Test1.class.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name);
}
}
}
class MyThread1 extends Thread {
String name;
public MyThread1(String name) {
this.name = name;
}
@Override
public void run() {
synchronized (Test1.class) {
System.out.println(name);
try {
Test1.class.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name);
}
}
}
这与第一个例子正好相反,她永远都不会出现成双成对的情况
这是由于,wait会释放锁