美文网首页
线程方法

线程方法

作者: 小团子语 | 来源:发表于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时间进行任务调度

相关文章

  • java多线程基础

    多线程 线程,进程,多线程 一、java线程 1. 线程状态 2. 线程方法 方法说明setPriority(in...

  • GCD

    多线程 NSTheard :alloc init 方法创建线程 。 start 方法启动线程 。然后系统会管理线程...

  • Java程序员福利——阿里架构师详解Java多线程常用方法的使用

    前言 Java多线程的常用方法基本分为:获取当前线程的操作,线程休眠sleep()方法,线程让步yield()方法...

  • 多线程 - NSThread

    创建和启动线程简单说明 1.创建,启动线程 1.1创建线程(3中方法) 方法1: 方法2: 方法3: 线程参数设置...

  • 1 多线程基础和Sync

    目录 进程、线程概念 创建线程的方法 线程常用方法 线程同步:Sync 1 进程线程概念 1.1 进程 进程指的是...

  • Java基础之线程

    一、线程分类 二、线程的实现方式 三、线程的状态 四、线程的核心方法 sleep()方法:该方法属于Thread类...

  • Java线程join()

    join 方法是一个阻塞方法,用来进行线程之间的交流。线程 A 调用 线程 B 的 join 方法,则线程 A 将...

  • Java start和run两种启动线程方式

    start方法和run方法启动线程 start()方法源码: 将该线程加入线程组 启动新线程 处于就绪状态,等待C...

  • 第十七节:Runnable创建线程,Thread创建线程,唤醒线

    Runnable创建线程 Thread创建线程 唤醒线程 线程类 主方法类 计数器多线程 实现接口 run方法 成...

  • 线程

    join方法加入线程方法 interrupt终止线程 yield礼让方法 暂不介绍啦,因为具体要看CPU 线程设置...

网友评论

      本文标题:线程方法

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