线程问题如果想交流的话可以加我qq 1135409377。
说明:LockSupport 底层是通过,sun.misc.Unsafe实现的。
1:public static Object getBlocker(Thread t)
返回提供给最近一次尚未解除阻塞的 park 方法调用的 blocker 对象,如果该调用不受阻塞,则返回 null。返回的值只是一个瞬间快照,即由于未解除阻塞或者在不同的 blocker 对象上受阻而具有的线程。
2:public static void park()
为了线程调度,禁用当前线程,除非许可可用。
如果许可可用,则使用该许可,并且该调用立即返回;否则,为线程调度禁用当前线程,并在发生以下三种情况之一以前,使其处于休眠状态:
- 其他某个线程将当前线程作为目标调用 unpark;
- 或者其他某个线程中断当前线程;
- 或者该调用不合逻辑地(即毫无理由地)返回。
此方法并不 报告是哪个线程导致该方法返回。调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定线程返回时的中断状态。
3:public static void park(Object blocker)
为了线程调度,在许可可用之前禁用当前线程。如果许可可用,则使用该许可,并且该调用立即返回;否则,为线程调度禁用当前线程,并在发生以下三种情况之一前,使其处于休眠状态:
此方法不 报告是哪个线程导致该方法返回。调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定返回时该线程的中断状态。
参数:
blocker - 导致此线程暂停的同步对象
4:public static void parkNanos(long nanos)
为了线程调度禁用当前线程,最多等待指定的等待时间,除非许可可用。如果许可可用,则使用该许可,并且该调用立即返回;否则,为线程调度禁用当前线程,并在发生以下四种情况之一以前,将其处于休眠状态:
此方法并不 报告是哪个线程导致该方法返回。调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定线程返回时的中断状态或所用的时间。
参数:
nanos - 要等待的最大纳秒数
5:public static void parkNanos(Object blocker,long nanos)
为了线程调度,在许可可用前禁用当前线程,并最多等待指定的等待时间。如果许可可用,则使用该许可,并且该调用立即返回;否则,为线程调度禁用当前线程,并在发生以下四种情况之一前,使其处于休眠状态:
此方法不 报告是哪个线程导致该方法返回。调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定返回时该线程的中断状态或已过的时间。
参数:
blocker - 导致此线程暂停的同步对象
nanos - 要等待的最大纳秒数
6:public static void parkUntil(long deadline)
为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
如果许可可用,则使用该许可,并且调用立即返回;否则,为线程调度禁用当前线程,并在发生以下四种情况之一以前,将其处于休眠状态:
此方法并不 报告是哪个线程导致该方法返回。调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定线程返回时的中断状态或当前时间。
参数:
deadline - 要等待的绝对时间,用相对于历元的毫秒数值表示,即 相对于格林威治时间1970年01月01日00时00分00秒 的毫秒数值表示
7:public static void parkUntil(Object blocker,long deadline)
为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
如果许可可用,则使用该许可,并且该调用立即返回;否则,为线程调度禁用当前线程,并在发生以下四种情况之一前,使其处于休眠状态:
此方法不 报告是哪个线程导致该方法返回。调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定返回时该线程的中断状态或当前时间。
参数:
blocker - 导致此线程暂停的同步对象
deadline - 要等待的绝对时间,用相对于历元 (Epoch) 的毫秒数值表示,即 相对于格林威治时间1970年01月01日00时00分00秒 的毫秒数值表示
8:public static void unpark(Thread thread)
如果给定线程的许可尚不可用,则使其可用。如果线程在 park 上受阻塞,则它将解除其阻塞状态。否则,保证下一次调用 park 不会受阻塞。如果给定线程尚未启动,则无法保证此操作有任何效果。
参数:
thread - 要执行 unpark 操作的线程;该参数为 null 表示此操作没有任何效果。
自定义阻塞类 MyBlock
package com.lp.myblock;
import java.util.concurrent.locks.LockSupport;
public class MyBlock {
/**
* 阻塞线程
* @throws InterruptedException
*/
public static void block() throws InterruptedException {
LockSupport.park();//建议使用,park(Object blocker),应为blocker对象在线程受阻塞时被记录,以允许监视工具和诊断工具确定线程受阻塞的原因,通过getBlocker(Thread t)方法获取blocker对象。
boolean isInterrupted = Thread.currentThread().isInterrupted();//也可以替换为 Thread.interrupted(),
// 方法 isInterrupted() 与 方法interrupted() 的区别
// 1:isInterrupted() 是非静态方法,interrupted() 是静态方法。
// 2:isInterrupted() 不会重置线程的中断状态,interrupted() 会重置线程的中断状态
if(isInterrupted) {
throw new InterruptedException(Thread.currentThread().getName() + "线程被中断");
}
}
/**
* 解除线程阻塞
* @param t
*/
public static void unBlock(Thread t) {
LockSupport.unpark(t);
}
}
测试类
package com.lp.myblock;
public class TestMain {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 线程开始运行");
try {
MyBlock.block();
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
System.out.println(Thread.currentThread().getName() + " 线程结束运行");
}
});
t1.setName("t1");//设置线程 名称
t1.start();//运行线程
Thread.sleep(1000);
// t1.interrupt();//手动中断线程
MyBlock.unBlock(t1);//接触线程阻塞
}
}