Java线程池,线程中断

在java中的线程池可以更加灵活的控制线程的生命周期,而且可以复用处于空闲状态的线程,更加省资源
其他的就不介绍了,介绍下:

newSingleThreadExecutor

  • newSingleThreadExecutor;这是一个统一时间只能执行单个线程的线程池,如果上一个线程还处于执行状态,那么新加进来的线程就会等待直到上一个线程执行完成,利用这点可以实现类似顺序队列一样的功能;

newSingleThreadScheduledExecutor

  • newSingleThreadScheduledExecutor;这是一个定时执行线程的线程池,它比timer更加可靠,因为timer执行定制任务的时候假如这个任务执行的时间比周期长,那么定时任务有可能重复执行,而newSingleThreadScheduledExecutor是上一个定时任务执行完了之后才开始计时,等周期到了才执行下一个定时任务;

BlockingQueue

  • BlockingQueue阻塞队列,take()和put()方法是会阻塞的,队列一般可用来与线程池配合使用完成对线程并发控制实现;

shutdown和shutdownNow

  • 线程池有shutdown():等线程池当中的任务全部执行完了之后关闭线程池;shutdownNow():不管当前线程池还有没有线程在执行都尝试立即关闭线程池并尝试取消正在执行的任务,如果线程任务没开始执行而在等待那么就不再执行,如果线程任务已经开始执行那么如果调用cancel(true)的话就会把符合中断条件的线程任务中断并抛出InterruptedException异常,如果是cancel(false)则会等正在执行的线程执行完了之后才关闭线程池,当正在执行的线程不满足中断条件(sleep,wait,join,或者NIO里面的中断)是不会被interrupt,而只会被clear中断标志,但是:当线程被I/O阻塞的时候,调用interrupt()的情况是依赖与实际运行的平台的。在Solaris和Linux平台上将会抛出InterruptedIOException的异常,但是Windows上面不会有这种异常,经过测试,貌似在linux上面也不能中断,我是用android模拟器测的,线程不会被中断也不会抛出InterruptedIOException异常,测的是IO阻塞。使用线程池的时候不用的话最好是关闭线程池。

DelayQueue

  • DelayQueue这是一个延迟队列,往队列中添加的任务可指定延迟时间,此队列可实现延迟执行任务,不过任务的延迟时间计时从任务添加进队列就开始了,因此加入一个任务延迟是5秒,你添加进去之后等10秒才取出执行那么这个任务将会立即执行,如果一个队列延迟10秒,添加进队列后3秒取出执行,那么会等待7秒后才能开始执行。

线程中断

  • java多线程编程无非就是线程等待,唤醒,线程中断,线程竞争,再复杂一些会涉及到join(),yield()方法的使用,多线程编程要控制好线程竞争和避免死锁,稍微有点复杂。
  • 在android开发中最好不要开太多线程,我曾经测试过,用android真机开了5000个线程,貌似只有两三千个线程顺利的执行,其他的全部都没有执行,因为在java中开启线程是比较耗费资源的,所以不能随便开线程;当然,在j2ee开发的时候一般很少考虑因为线程开多了而出现异常的情况,因为服务器内存资源足够庞大,但是android开发就不行,android内存资源非常有限。
  • 如果要灵活控制线程中断的话最好在线程中加一个标志位,因为线程中断方法interrupt()只能中断符合中断条件的线程,如果不符合中断条件的线程interrupt()方法只能clear中断标志而无法中断该线程,所以加一个标志位来标识线程不执行了,例如:while(flag){// do something}
  • Thread的void interrupt()和static boolean interrupted()方法的区别:interrupt()方法除了中断符合中断要求的线程之外还会设置线程中断标志使得isInterrupted()返回true,但是当这个线程isAlive()返回false的话isInterrupted()也将返回false;而interrupted()方法是判断线程是否中断,并且会clear线程中断标志,也就是说连续调用两次interrupted(),第一次返回true,第二次将返回false,因为线程中断标志被clear了,但是isInterrupted()方法是只会判断当前线程是否中断而不会clear线程的中断标志,详情可参考jdk的官方文档,文档中对上述的方法做了很详细的说明。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值