JavaSE-多线程(11)- LockSupport
使用LockSupport 类可使线程暂停,请看下例:
例1
线程 t1 执行 LockSupportTest 类run方法,在run方法中,每隔1秒输出一次 i 的值,一共输出10次,在i等于5时暂停线程,主线程睡眠8秒后,调用 activate 方法(实际调用 LockSupportTest 对象即锁的notify方法),t1线程继续执行
package com.hs.example.base.multithread.day01;
public class LockSupportTest {
public synchronized void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i == 5) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//激活线程
public synchronized void activate() {
this.notify();
}
public static void main(String[] args) {
LockSupportTest lockSupportTest = new LockSupportTest();
Thread t1 = new Thread(() -> {
lockSupportTest.run();
});
t1.start();
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程睡眠结束。。。");
// 注意,此处不能写成:lockSupportTest.notify(),否则会抛 IllegalMonitorStateException 异常
// 因为调用object.notify方法的前提是需要获取对象锁
// 此时 t1 线程已经释放了锁,所以调用 lockSupportTest.activate() 方法后主线程可以获取 lockSupportTest 锁
// activate 方法内调用 this.notify(); 不会有问题,因为此时调用线程已经获取锁
lockSupportTest.activate();
}
}
0
1
2
3
4
5
主线程睡眠结束。。。
6
7
8
9
如何使用 LockSupport 类实现例1效果?请看例2:
例2
例2执行结果与例1一样,
public class LockSupportTest2 {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i == 5) {
//暂停当前线程
LockSupport.park();
}
}
}
public static void main(String[] args) {
LockSupportTest2 lockSupportTest = new LockSupportTest2();
Thread t1 = new Thread(() -> {
lockSupportTest.run();
});
t1.start();
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程睡眠结束。。。");
//恢复t1线程执行
LockSupport.unpark(t1);
}
}