java-并发 线程机制学习

1、线程机制

多个多线程机制,每个线程单独的控制子任务的执行,每个线程都好像有自己的CPU一样,可以方便的并发执行任务。线程机制简化了在单一程序中同时交织的多个操作处理,使用多线程时 ,CPU会轮流给每个任务分配其占用资源和时间。

如此说来 ,线程机制优势是什么呢?

在考虑有限的系统中,我们需要为速度和所耗资源所担忧,引入复杂的线程机制,除了对线程的控制,CPU切片还存在时间内耗,因此,线程的引入并不会减少对资源的消耗。

使用线程机制,是为了建立一种特命的可扩展的程序方法。如果只是在单核CPU上执行程序,线程的引入并不会有什么优势,因此多核CPU与线程的是极其合适的搭配。因此增加CPU,可方便的增加程序的速度。

多任务和多线程是使用多处理器系统的最佳方式,现今各主流的企业和个人的电脑,工作机,服务器也全都是多核CPU。

2、Runable

java语言提供了Runable接口来描述任务,只需要实现run方法,使之执行你的命令。

而run方法通常需要设计成某种循环的形式,直到满足条件才跳出。

3、Thread.yield

在run中调用静态方法Thread.yield可以将CPU转移给另外一个线程,当然,肯定是早前一个任务已经完全执行完生命周期后才会进行切换。

4、Thread

Thread被用来驱动Runable构造的任务对象,通过start方法,执行必须初始化操作后调用run方法。另外使用Thread时,其在任务退出run并死亡前,垃圾回收将无法清除它。因为它自己注册了它自己。

不过每个Thread示例只负责一个Runable,是管理线程变得复杂,自然的,java提供一个更加强大的工具Executer。

5、Executer

java SE5的java.util.concurrent包中执行器Executer将为你管理对象。可以理解Executer为一个擦屁股的管家,它不会在意你想何时执行任务,只是帮你默默管理线程启动后到结束的整个声明周期。

这里我们只需声明一个ExecuterService对象,调用execute方法给他任意数量的具体的任务Thread,它会直到构建恰当的上下文在执行Runable对象,在最后简单使用shutdown方法的吩咐这个尽职管家,在完成所有任务执行自行退出。

一般的,java提供好几种创建ExecuterService的方式,不同方式生成的管家性格不同。

newCacheThreadPool:最普通,最实用的,可大可小,灵活

newFixedThreadPool: 体型固定,量体裁衣

newSingleThreadPool: 单身狗,但是做事有条不紊,一一道来

newScheduledThreadPool: 有规划作业表的处女座

6、newCacheThreadPool

一般的,可以认为newCacheThreadPool创建的线程池是无限制的,但不会无限制的创建线程,如果超过需求,它会自己回收空闲线程,但是现有线程池不够得话,它会自动变大。比较适合处理执行时间比较小的任务,数量不定,且计算机资源充足的情况。因此,不太懂得话,建议你优先适用newCacheThreadPool,如果出现了问题,才需要考虑切换到newFixedThreadPool。

7、newFixedThreadPool

newFixedThreadPool就是适合小家子气的家伙,多大能力干多大的事。使用它之前需要充分认识自己的资源,能力,需求,做不了的就等以后再做一个一个来。

8、newSingleThreadPool

私认为这个家伙算不上是多线程,就是顺序执行一样,一个个来。

现行大多数GUI程序都是单线程的。Android中单线程可用于数据库操作,文件操作,应用批量安装,应用批量删除等不适合并发但可能IO阻塞性及影响UI线程响应的操作。

9、newScheduledThreadPool

这个家伙呢有个好处,准时开始,不迟到,因此啊,我们通常拿他来管理周期的,定时的任务。

10、Callable

多线程好是好,但是我们不知道这所有的任务什么时候结束,傻傻等待得不到事情的结果总是难受的,因此不能再使用Runable这个老朋友来声明任务对象,需要切换到新朋友Callable身上了。

Callable也是Java SE5引入的,一个带有类型参数的泛型,这个参数表示从call方法中返回的值。这种特殊的任务,也必须特殊的使用ExecuteService.submit来调用执行。submit将会返回一个Future对象,与callable返回的结果特定类型进行参数化。

通过isDone来判定Future是否完成,再通过get获取call的返回值。不用isDone直接get的话,get会处于阻塞等待,直到结果准备就绪。因此判定任务是否完成,可以通过isDone也可以根据get是否阻塞,是否有返回值来进行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值