美文网首页
线程方法

线程方法

作者: 小团子语 | 来源:发表于2019-06-20 23:41 被阅读0次

    1.实例方法t1.interrupt()中断线程

    线程中断并不会立即使线程退出,告知目标线程中断(设置中断标识位,表示当前线程已经被中断了),至于目标线程接到通知后如何处理,则完全由目标线程自行决定。

    实例方法t1.isInterrupted():检查中断标识位,判断当前线程是否被中断;

    静态方法Thread.interrupted():判断当前线程的中断状态,并清除当前线程的中断标识位。

    2.被废弃方法

    Thread.stop():会直接终止线程,并且会立即释放这个线程所持有的锁。

    suspend():暂停线程,不释放任何锁资源,状态仍然是Runnable。

    resume(): 继续执行,suspend后必须resume才能继续执行。

    3.    等待线程结束join和谦让yield、sleep

    join():一直阻塞当前线程,直到目标线程执行完毕;

    eg:  t1.join()则阻塞当前线程,等待目标线程t1执行完毕(即让调用线程wait在当前线程对象实例上);

    join(long):阻塞当前线程long时间,若目标线程还未执行完毕,当前线程继续执行;

    静态方法yield():使当前线程让出CPU(但还可以进行CPU资源的争夺),让给同等优先级或者更高优先级,进入就绪状态;

    静态方法sleep():不考虑优先级,不释放锁,不让出系统资源,进入阻塞状态,需要捕获异常;Thread.sleep(0)会触发系统进行一次CPU竞争;

    4.多线程协作等待wait和通知notify(需包含在synchronized语句中)

    线程A获得obj的监视器后,调用了obj.wait()方法,那线程A释放obj的监视器,并进入obj对象的等待队列;

    当线程B获得obj的监视器后,调用obj.notify()方法,那线程B释放obj的监视器,系统从obj对象的等待队列中随机唤醒一个线程如C;

    C唤醒后尝试重新获取obj的监视器,获取成功后,继续执行代码;

    5.同步(限制同时只有一个线程访问)

    (1)volatile:只能保证可见性;表示这个变量会被多线程更改,只能保证一个线程修改后,另外的线程读到的是修改后的值;

    (2)synchronized:保证可见性和有序性,可作用在对象,类,实例方法,静态方法上,不能响应中断;

    (3)重入锁ReentrantLock:能响应中断,设置超时,有lock(),lockInterruptibly(),tryLock,tryLock(time),unlock方法;和Condition结合,实现等待-通知机制,如Condition cold = lock.newCondition(),一个lock可有多个Condition,如ArrayBlockingQueue有NOT_EMPTY和NOT_FULL的两个Condition;

    6.多线程并发(允许多个线程同时访问)

    (1)ReentrantReadWirteLock:读-读不限制,读/写或写-写限制

      (2) 信号量Semaphore: 有方法acquire(),release(),tryAcquire()

      (3) 倒计时器CountDownLatch:await()等待检查,countDown()完成一个线程

      (4)循环栅栏CyclicBarrier:可以在计数完成后,执行指定的runnable,有await方法,线程等待;

    7.线程阻塞工具类

    (1)LockSupport:和Thread.suspend()相比(线程仍然处理Runnable状态),弥补了若resume()在suspend()前发生导致线程无法继续执行的情况;和Object.wait()相比,它不需要先获取某个对象的锁,也不会抛出InterruptedException异常;有park()(线程处于WAITING状态)和unpack()方法,为每个线程只准备一个许可;

    8.线程池

    Executors是线程池工厂,ThreadPoolExecutor是一个线程池,通过Executors可以创建各种类型的线程池。

    public ThreadPoolExecutor(int corePoolSize,int maxPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)

    其中keepAliveTime:指超过corePoolSize的线程在多长时间内会被销毁;

    threadFacatory: 用于创建线程、一般默认;

    handler:拒绝策略,有AbortPolicy:直接抛出异常,阻止系统正常工作;CallerRunsPolicy:只要线程池未关闭,直接在调用者线程中运行当前被丢弃的任务;DiscardOledestPolicy:丢弃最老的请求;DiscardPolicy:默默丢弃任务;

    (1)Executors.newFixedThreadPool(int nThread);其内部实现是

    new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLSECONDS,new LinkedBlockQueue<Runnable>())

    (2)Executors.newSingleThreadExecutor();其内部实现是

    new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLSECONDS,new LinkedBlockQueue<Runnable>()));

    (3)newCachedThreadPool();其内部实现是

    new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>())

    (4)newSingleThreadScheduledExecutor()

    (5)newScheduledThreadPool(corePoolSize);

    而newScheduledThreadPool得到的是一个ScheduledThreadPool,有schedule和scheduleAtFixedRate方法:以上一个任务开始执行时间为起点,之后的period时间,调度下一次任务;(若任务执行时间>调度周期period)那么调度周期会按照任务执行时间来;

    scheduleWithFixedDelay方法:上一个任务结束后,再经过delay时间进行任务调度

    相关文章

      网友评论

          本文标题:线程方法

          本文链接:https://www.haomeiwen.com/subject/pgisqctx.html