Java通过继承Thread类来创建并启动多线程的步骤如下:
- 定义Thread 类的子类,并重写该类的 run() 方法,该 run() 方法的方法体就代表了线程必要完成的任务
- 创建 Thread 子类的实例,即创建了线程对象
- 调用线程对象的 start() 方法来启动该线程
同步机制的原理,其实就相称于给某段代码加“锁”,任何线程想要执行这
段代码,都要先得到“锁”,我们称它为同步锁。因为Java对象在堆中的数
据分为分为对象头、实例变量、空白的填充。而对象头中包含:
哪个线程得到了“同步锁”对象之后,”同步锁“对象就会记载这个线程的
- Mark Word:记载了和当前对象有关的GC、锁标记等信息。
- 指向类的指针:每一个对象必要记载它是由哪个类创建出来的。
- 数组长度(只有数组对象才有)
ID,这样其他线程就只能等待了,除非这个线程”开释“了锁对象,其他
线程才能重新得到/占"同步锁"对象。
synchronized 与 Lock 的对比7. 线程的通讯
- Lock 是显式锁(手动开启和关闭锁,别忘记关闭锁),synchronized是隐式锁,出了作用域、遇到异常等自动解锁
- Lock 只有代码块锁,synchronized 有代码块锁和方法锁
- 使用 Lock 锁,JVM 将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类),更表现面向对象。
- (了解)Lock 锁可以对读不加锁,对写加锁,synchronized 不可以
- (了解)Lock 锁可以有多种获取锁的方式,可以从 sleep 的线程中抢到锁,synchronized 不可以
说明:开辟建议中处理线程安全问题优先使用顺序为:
Lock ----> 同步代码块 ----> 同步方法
举例:
生产者(Productor)将产品交给伙计(Clerk),而消耗者(Customer)从伙计
处取走产品,伙计一次只能持有固定数量的产品(比如:20),如果生产者试
图生产更多的产品,伙计会叫生产者停一下,如果店中有空位放产品了再通
知生产者继续生产;如果店中没有产品了,伙计会告诉消耗者等一下,如果
店中有产品了再通知消耗者来取走产品。
– 相比run()方法,可以有返回值
– 方法可以抛出异常
– 支持泛型的返回值(必要借助FutureTask类,获取返回结果)
– 可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。
– FutureTask是Futrue接口的唯一的实现类
– FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |