sleep()和wait()有什么区别?
1)sleep()方法是线程类(Thread)的静态方法,wait()方法是Object类的方法;
2)sleep()方法让调用线程进入睡眠状态,让出执行机会给其他线程,但是监控状态依然保持,时间到了自动恢复运行状态,wait()会让线程放弃对象锁,进入等待此对象的等待锁定池,只有notify()、notifyAll()方法才会进入运行状态;
3)调用sleep()方法的过程中,线程不会释放对象锁,而调用wait()方法的时候,线程会放弃对象锁。
run()和start()有什么区别?
start()是线程的启动者,run()是线程任务的运行者。
每个线程都是通过Thread对应的run()方法来执行(线程体),通过调用Thread类的start()方法来启动一个线程。
1)start()方法真正实现了多线程运行,调用 start() 方法来启动线程时会自动调用 run();而直接调用 run() 方法就直接执行,达不到多线程运行的目的。
2)一个线程对线的 start() 方法只能调用一次,多次调用会抛出 java.lang.IllegalThreadStateException 异常;run() 方法没有限制。
public class TestThreadRunStart {
private static void testRun(Thread t) {
t.run();
try {
Thread.sleep(1000);// 休眠1秒
System.out.println(">>>休眠1秒<<<");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static void testStart(Thread t) {
t.start();
try {
Thread.sleep(1000);// 休眠1秒
System.out.println(">>>休眠1秒<<<");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Thread t = new Thread() {
@Override
public void run() {
// 休眠3秒
try {
Thread.sleep(3000);
System.out.println("===休眠3秒===");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread running...");
}
};
//testRun(t);
/**
* ===休眠3秒===
* Thread running...
* >>>休眠1秒<<<
*/
testStart(t);
/**
* >>>休眠1秒<<<
* ===休眠3秒===
* Thread running...
*/
}
}
notify()和notifyAll()有什么区别?
上文提过,如果线程调用了对象的wait()方法,那么只有调用notifyAll()或notify()方法唤醒。
所以notifyAll()方法是唤醒所有wait线程,而notify()方法只随机唤醒一个wait线程。也就是说,调用了notify只有一个线程会由等待池进入锁池,而notifyAll会将该对象等待池内的所有线程移动到锁池中,等待锁竞争。
优先级高的线程竞争到对象锁的概率大,假若某线程没有竞争到该对象锁,它还会留在锁池中,唯有线程再次调用wait()方法,它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行,直到执行完了 synchronized代码块,它会释放掉该对象锁,这时锁池中的线程会继续竞争该对象锁。