线程作为java核心技术,sleep() 和 wait() 都有阻塞线程的作用,两者也有很大的不同点,以下通过测试代码说明
JDK 1.5之前,对多线程同步的处理也就synchronized,sleep() , wait(), notify()
- sleep()
public class ThreadTest2 {
public static void main(String[] args) {
Object o = new Object();
Thread1 thread1 = new Thread1(o);
Thread t1 = new Thread(thread1);
Thread t2 = new Thread(thread1);
t1.start();
t2.start();
}
}
// 任务类
class Thread1 implements Runnable {
Object o;
Thread1(Object o) {
this.o = o;
}
@Override
public void run() {
synchronized (o) {
System.out.println(Thread.currentThread().getName() + "----start");
try {
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName() + "----end");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Thread-0----start
Thread-0----end
Thread-1----start
Thread-1----end
- wait(), notify()
public class ThreadTest {
public static void main(String[] args) {
Object o2 = new Object();
Thread t1= new Thread(new Runnable() {
@Override
public void run() {
try {
synchronized (o2) {
System.out.println(Thread.currentThread().getName() + "---start");
o2.wait();
System.out.println(Thread.currentThread().getName() + "---end");
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
synchronized (o2) {
System.out.println(Thread.currentThread().getName() + "---start");
o2.notify();
System.out.println(Thread.currentThread().getName() + "---end");
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
}
}
Thread-0—start
Thread-1—start
Thread-1—end
Thread-0—end
四条输出同时输出,没有锁等待,也没有wait()等待
sleep() VS wait()
sleep() 是线程的方法,当前线程本身的阻塞,不会影响其他线程的执行
wait() 是对象方法,不一定是当前被锁的对象