java接口补全_JAVA 并发(待补全!)

从性能上看 如果没有任务会阻塞 那么在单处理器的机器人使用并发就没有任何意义 (需要上下文切换 时间反而长)

进程是运行在他自己地址空间的自包容的程序

c75d74a2d0bf30d63dc4135f6cca6915.png

协作多线程与抢占式多线程

f2be9142378285440ef0f5e3b5070d76.png

008f6378dc300afbe2ecef4e8e9796e5.png

想要定义任务需要实现Runnable接口并编写run方法

将任务转变为工作任务的方法是将它交给一个Thread构造器

Thread t=new Thread(Runnable r);

t.start();

线程调度机制是非确定的 每次运行的结果可能都会不同

或者继承Thread类(Thread类中的API都被声明为native方法 也就是不具备平台无关性)

7cf73d945a7983897a4bc16483b17cc5.png

但是此时只能调用一次start方法调用多次会抛出异常  m1.start()   ;m1.start();

也可以使用Executor

11ca36a84178aafbd054bf76aeb49b3b.png

LiftOff为实现了Runnable接口的类

08336d70717f9fc92e3e6627ef9307fc.png

465cf8985120d4b89def3bf15c8d285c.png

604fe5f3701c0e0af2c6b72b1013b0a4.png

c3ba7b29e338969bb7467cb689ff271f.png

fab7b27680f6f322da04f0dd1d1c1c28.png

Runnable是执行工作的独立任务 但是它不返回任何值 如果希望任务完成时返回一个值,那么可以实现Callable接口 是从方法call中返回的值

7c782f09c3b867ce7f139a935dc5ea90.png

后台线程

310c7bb73bc311be47dc7dd591f96987.png

后台线程派生出的子线程都是后台线程

两种实现方式的区别和联系:

在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

避免点继承的局限,一个类可以继承多个接口。

适合于资源的共享

原子性 要么还未开始,要么执行结束,不存在中间的状态 read、load、assign、use、store、write具有原子性  以及synchronized块之间的操作

可见性除了可以用volatile保证还可以用synchronized和final保证

volatile关键字:第一保证变量对所有线程的可见性,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新;第二,禁止指令重排序列化,从而保证某些对变量的操作按顺序执行。

有序性 由volatile和synchronized关键字保证

线程的集中状态之间的转换

bc139255fc03c67dc44644dded544ccd.png

e0bb70f5b076f7defe5992f12eea345c.png

7d4211f9e33dd1da478f8c10f938ea0e.png

线程安全的容器 也并非绝对的安全

25e7528e0c921d6e90a64c10c45bf0e2.png

6022a4b1be8598ce8377482dea2875f8.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值