public static void test3(){ ThreadB b = new ThreadB();
b.start();
synchronized (o) {//主线程获取o上的锁 try { System.out.println("Waiting for b to complete..."); o.wait();//然后释放了 } catch (Exception e) { e.printStackTrace(); } System.out.println("Total is: " + b.total); } } } class ThreadB extends Thread { int total = 0;
public void run() { synchronized (WaitTest.o) {//导致ThreadB可以获取到锁 System.out.println("ThreadB"); for (int i = 0; i < 50; i++) { total += i; try { Thread.sleep(100); System.out.print(i); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(); WaitTest.o.notify();//执行完毕,释放锁,唤醒等待线程,导致主线程继续执行 } } }
public static void test3(){
ThreadB b = new ThreadB();
b.start();
synchronized (o) {//主线程获取o上的锁
try {
System.out.println("Waiting for b to complete...");
o.wait();//然后释放了
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread {
int total = 0;
public void run() {
synchronized (WaitTest.o) {//导致ThreadB可以获取到锁
System.out.println("ThreadB");
for (int i = 0; i < 50; i++) {
total += i;
try {
Thread.sleep(100);
System.out.print(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println();
WaitTest.o.notify();//执行完毕,释放锁,唤醒等待线程,导致主线程继续执行
}
}
}
Thread.sleep(long l)和object.wait(long l)
共同点: 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
不同点:
1.Thread.sleep(long)可以不在synchronized的块下调用,而且使用Thread.sleep()不会丢失当前线程对任何对象的同步锁(monitor);
2.object.wait(long)必须在synchronized的块下来使用,调用了之后失去对object的monitor, 这样做的好处是它不影响其它的线程对object进行操作
1楼说得对.