线程常用方法
sleep()
1.让当前线程暂停指定时间。
2.sleep()只是暂时让出CPU的执行权,并不释放锁。
public class SleepTest {
/**
* sleep()方法不会释放锁,因此线程是按照先后顺序执行的
*/
public synchronized void sleepMethod(){
System.out.println("Sleep start : "
+ Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Sleep end : "
+ Thread.currentThread().getName());
}
/**
* wait()方法会释放锁,因此一旦调用wait()方法就会造成其他线程运行
*/
public synchronized void waitMethod(){
System.out.println("Wait start : "
+ Thread.currentThread().getName());
synchronized (this){
try {
wait(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Wait end :"
+ Thread.currentThread().getName());
}
public static void main(String[] args) {
final SleepTest test1 = new SleepTest();
for(int i = 0; i < 5; i++){
new Thread(() -> test1.sleepMethod()).start();
}
try {
//暂停十秒,等上面程序执行完成
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("-----分割线-----");
final SleepTest test2 = new SleepTest();
for(int i = 0; i < 5; i++){
new Thread(() -> test2.waitMethod()).start();
}
}
}
输出结果:
Sleep start : Thread-0
Sleep end : Thread-0
Sleep start : Thread-4
Sleep end : Thread-4
Sleep start : Thread-3
Sleep end : Thread-3
Sleep start : Thread-2
Sleep end : Thread-2
Sleep start : Thread-1
Sleep end : Thread-1
-----分割线-----
Wait start : Thread-5
Wait start : Thread-6
Wait start : Thread-7
Wait start : Thread-8
Wait start : Thread-9
Wait end :Thread-7
Wait end :Thread-8
Wait end :Thread-9
Wait end :Thread-5
Wait end :Thread-6
从代码中可以看出来两个方法都是同步方法,加了锁,但是sleep()方法是有顺序的,0线程先抢占到了执行权,执行后sleep()没有释放锁,其他线程不能进这个方法,等到释放后其他的才会继续抢占。而wait()方法会释放对象锁,一旦wait(),其他的线程就进来抢占
3.由于对象锁没有被释放,其他线程仍然无法访问这个对象。
4.sleep()方法不需要在同步的代码块中执行。
5.sleep()方法可以通过interrupt()方法打断线程的暂停状态。
6.sleep()只是线程的操作,用于短时间暂停线程,不涉及线程间通信。
7.sleep()是Thread类的方法。
wait()方法
1.wait()/notify()通常成对出现。
2.wait()/notify()方法需要获取对象锁方可调用。
3.wait()/notify()方法要写在同步代码块或者同步方法内。
4.一旦调用wait()方法,其他对象方可访问这个对象。
5.当一个线程执行到wait()方法时,他就进入到一个和该对象相关的等待池中,同时失去对象的机锁,可以允许其他线程执行一些同步操作。
6.wait()可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出中断异常。
7.重获对象锁
a)设置wait()方法的参数,如wait(1000)表明借出去1秒钟后自动收回锁
b)让借锁的线程通知(notify())当前线程,借锁线程用完了当前线程马上就收回来
8.wait()/notify()是Object类的方法
notify()/notifyAll()
1.notify()唤醒在对象监视器(对象锁)上等待的单个线程
2.当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。
3.该线程将等待从锁池中获得锁,然后回到wait()前的中断现场
4.notifyAll()唤醒在对象监视器(对象锁)上等待的所有线程
5.唤醒线程的顺序——LIFO
6.wait()/notify()/notifyAll()涉及线程间的通信