java自定义线程阻塞

线程问题如果想交流的话可以加我qq 1135409377。

LockSupport api 说明

说明: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)
为了线程调度,在许可可用之前禁用当前线程。如果许可可用,则使用该许可,并且该调用立即返回;否则,为线程调度禁用当前线程,并在发生以下三种情况之一前,使其处于休眠状态:

  • 其他某个线程调用将当前线程作为目标调用 unpark;
  • 或者 其他某个线程中断当前线程;
  • 或者 该调用不合逻辑地(即毫无理由地)返回。

此方法不 报告是哪个线程导致该方法返回。调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定返回时该线程的中断状态。

参数:
blocker - 导致此线程暂停的同步对象

4:public static void parkNanos(long nanos)

为了线程调度禁用当前线程,最多等待指定的等待时间,除非许可可用。如果许可可用,则使用该许可,并且该调用立即返回;否则,为线程调度禁用当前线程,并在发生以下四种情况之一以前,将其处于休眠状态:

  • 其他某个线程将当前线程作为目标调用 unpark;
  • 或者其他某个线程中断当前线程;
  • 或者已超过指定的等待时间;
  • 或者该调用不合逻辑地(即无缘无故地)返回。

此方法并不 报告是哪个线程导致该方法返回。调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定线程返回时的中断状态或所用的时间。

参数:
nanos - 要等待的最大纳秒数

5:public static void parkNanos(Object blocker,long nanos)
为了线程调度,在许可可用前禁用当前线程,并最多等待指定的等待时间。如果许可可用,则使用该许可,并且该调用立即返回;否则,为线程调度禁用当前线程,并在发生以下四种情况之一前,使其处于休眠状态:

  • 其他某个线程将当前线程作为目标调用 unpark;
  • 或者 其他某个线程中断当前线程;
  • 或者 已超过指定的等待时间;
  • 或者 该调用不合逻辑地(即毫无理由地)返回。

此方法不 报告是哪个线程导致该方法返回。调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定返回时该线程的中断状态或已过的时间。

参数:
blocker - 导致此线程暂停的同步对象
nanos - 要等待的最大纳秒数

6:public static void parkUntil(long deadline)
为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
如果许可可用,则使用该许可,并且调用立即返回;否则,为线程调度禁用当前线程,并在发生以下四种情况之一以前,将其处于休眠状态:

  • 其他某个线程将当前线程作为目标调用unpark;
  • 或者其他某个线程中断当前线程;
  • 或者指定的最后期限已过;
  • 或者该调用不合逻辑地(即毫无理由地)返回。

此方法并不 报告是哪个线程导致该方法返回。调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定线程返回时的中断状态或当前时间。

参数:
deadline - 要等待的绝对时间,用相对于历元的毫秒数值表示,即 相对于格林威治时间1970年01月01日00时00分00秒 的毫秒数值表示

7:public static void parkUntil(Object blocker,long deadline)
为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
如果许可可用,则使用该许可,并且该调用立即返回;否则,为线程调度禁用当前线程,并在发生以下四种情况之一前,使其处于休眠状态:

  • 其他某个线程将当前线程作为目标调用 unpark;
  • 或者其他某个线程中断当前线程;
  • 或者指定时限已过;
  • 或者该调用不合逻辑地(即毫无理由地)返回。

此方法不 报告是哪个线程导致该方法返回。调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定返回时该线程的中断状态或当前时间。

参数:
blocker - 导致此线程暂停的同步对象
deadline - 要等待的绝对时间,用相对于历元 (Epoch) 的毫秒数值表示,即 相对于格林威治时间1970年01月01日00时00分00秒 的毫秒数值表示

8:public static void unpark(Thread thread)
如果给定线程的许可尚不可用,则使其可用。如果线程在 park 上受阻塞,则它将解除其阻塞状态。否则,保证下一次调用 park 不会受阻塞。如果给定线程尚未启动,则无法保证此操作有任何效果。

参数:
thread - 要执行 unpark 操作的线程;该参数为 null 表示此操作没有任何效果。

java自定义线程阻塞

自定义阻塞类 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);//接触线程阻塞
    }
}

你可能感兴趣的:(java,线程,thread)