教你如何使用Java多线程编程LockSupport工具类
什么是LockSupport
LockSupport是JavaSE 5引入的一个工具类,用于线程的阻塞和唤醒。它可以在任何时刻,让一个正在运行的线程阻塞或者唤醒它。
LockSupport的使用
park()方法
LockSupport类下的park方法可以阻塞线程,直到调用它的unpark方法或者被中断。
public static void park();
例如:
public void test1() {
Thread thread = Thread.currentThread();
System.out.println("thread start...");
LockSupport.park();
System.out.println("thread end...");
}
这个线程在执行到LockSupport.park()方法时会阻塞,直到别的线程调用了它的unpark方法。
unpark()方法
unpark方法可以唤醒指定的线程。如果先调用了unpark方法,再调用park方法,则不会被阻塞。
public static void unpark(Thread thread);
例如:
public void test2() {
Thread thread = Thread.currentThread();
System.out.println("thread start...");
LockSupport.unpark(thread);
System.out.println("thread end...");
}
这个线程执行到LockSupport.unpark()方法后,即使后面有LockSupport.park()方法,也不会被阻塞。
中断响应
LockSupport工具类不会抛出InterruptedException异常,但可以响应中断。
例如:
public void test3() {
Thread thread = Thread.currentThread();
System.out.println("thread start...");
try {
Thread.sleep(5000); // sleep 5s 让线程阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
LockSupport.park();
System.out.println("thread end...");
}
如果在这个线程被阻塞时,调用了它的interrupt方法,那么它会把中断标志设为true,但是LockSupport.park()方法并不会抛出InterruptedException异常。因此需要在LockSupport.park()方法所在的代码中判断中断标志,然后退出线程。
例如:
public void test4() {
Thread thread = Thread.currentThread();
System.out.println("thread start...");
try {
Thread.sleep(5000); // sleep 5s 让线程阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
LockSupport.park();
if (thread.isInterrupted()) {
System.out.println("Thread is interrupted!");
}
System.out.println("thread end...");
}
这样就可以在阻塞中响应中断了。
示例说明
示例一
public void test5() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread start...");
LockSupport.park(); // 线程阻塞
System.out.println("thread end...");
}
});
thread.start(); // 启动线程
try {
Thread.sleep(3000); // sleep 3s
} catch (InterruptedException e) {
e.printStackTrace();
}
LockSupport.unpark(thread); // 唤醒线程
}
这个例子中,新建一个线程,首先启动线程,等待3s后唤醒线程,然后线程继续执行。
结果输出:
thread start...
thread end...
解释:线程阻塞时等待被唤醒,3s后主线程唤醒该线程,该线程恢复执行,然后直接执行到结束语句。
示例二
public void test6() throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread start...");
LockSupport.park(); // 线程阻塞
if (Thread.currentThread().isInterrupted()) {
System.out.println("Thread is interrupted!");
}
System.out.println("thread end...");
}
});
thread.start(); // 启动线程
thread.interrupt(); // 中断线程
thread.join(); // 等待线程结束
}
这个例子中,新建一个线程,首先启动线程,然后中断线程,最后等待线程结束。
结果输出:
thread start...
Thread is interrupted!
thread end...
解释:线程阻塞时被中断,判断到中断标志,然后退出线程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:教你如何使用Java多线程编程LockSupport工具类 - Python技术站