java自定义线程阻塞

来源:互联网 发布:超链接调用js 编辑:程序博客网 时间:2024/04/30 19:45

线程问题如果想交流的话可以加我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自定义线程阻塞

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