美文网首页
Java学习day-24:多线程与并发

Java学习day-24:多线程与并发

作者: 开源oo柒 | 来源:发表于2019-08-09 22:28 被阅读0次

    一、Callable接口

    1.实现Callable接口:

    (1)Thread类与Runnable接口实现多线程的缺点:

    1) 没有返回值;

    2) 不支持泛型;

    3) 异常必须处理;

    (2)Callable接口实现多线程的好处:

    1) Future 接 口 位 于 java.util.concurrent 包 中 ,可 以 对 具 体Runnable、Callable 任务的执行结果进行取消(cancel 方法,尝试取消执行此任务)、查询是否完成(isDone 方法)、获取结果(get 方法,等待完成,然后检索其结果)等。

    2) FutrueTask 是 Futrue 接口的唯一的实现类;

    3) FutureTask 同时实现了 Runnable, Future 接口。它既可以作为 Runnable 被线程执行,又可以作为 Future 得到Callable 的返回值。

    (3)实现步骤:

    1)创建线程任务

    2)创建一个资源管理器,实现RunnableFuture接口,RunnableFuture是Future与Runnable的子接口。

    3)启动线程;

    4)获得取值范围;

    5)判断任务是否执行结束。

    代码截图 结果

    二、线程同步Lock锁

    1.Lock锁:

    (1)实现线程同步的方式:

    1)synchronize方法:

    2)synchronize代码块;

    3)Lock代码块;

    (2)Lock与synchronize的区别:

    1)Lock是显示锁,synchronize是隐式锁。

    2)Lock只有代码锁,synchronize有代码块锁和方法锁;

    3) 使用 Lock 锁,JVM 将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性。

    4) Lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。lock()方法会对 Lock 实例对象进行加锁,因此所有对该对象调用 lock()方法的线程都会被阻塞,直到该 Lock 对象的 unlock()方法被调用。

    (3)步骤:

    1)创建Lock对象;

    2)调用lock()方法上锁;

    3)调用unlock()方法解锁;

    代码截图 结果

    2.线程池:

    (1)什么是线程池?

    1)创建对象:需要分配内存等资源。

    2)销毁对象 :虽然不需要程序员操心,但是垃圾回收器会在后台一直跟踪并销毁;

    对于经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。

    3)思路 :创建好多个线程,放入线程池中,使用时直接获取引用,不使用时放回池中。可以避免频繁创建销毁、实现重复利用。

    (2)线程池的好处:

    1)提高响应速度(减少了创建新线程的时间);

    2)降低资源消耗(重复利用线程池中线程,不需要每次都创建);

    3)提高线程的可管理性:避免线程无限制创建、从而销毁系统资源,降低系统稳定性,甚至内存溢出或者 CPU 耗尽。

    (3)应用场合:

    1)需要大量线程,并且完成任务的时间短;

    2)对性能要求苛刻;

    3)接受突发性的大量请求。

    代码截图 结果

    3.任务调度:

    (1)什么是任务调度?

    任务:就是事情

    调度:在不同的时间点或者在指定的时间点或者间隔多长时

    间我去运行这个任务。

    (2)相关类:java.util.Timer类。

    (3)实例:实现时间的动态刷新。

    代码截图 结果

    三、ThreadLocal

    1.ThreadLocal类:

    ThreadLocal 直译为“本地线程”,其实它就是一容器,用于存放线程的局部变量。

    作用:为解决多线程程序的并发问题

    构造方法:

    1)ThreadLocal():创建一个线程本地变量。

    常用方法:

    1)set(T value):将此线程局部变量的当前线程副本中的值设置为指定值。

    2.)get():返回此线程局部变量的当前线程副本中的值。

    3)initialValue():返回此线程局部变量的当前线程的“初始值”。

    4)remove():移除此线程局部变量当前线程的值。

    案例:实现一个序列号的生成器程序。

    自定义Sequence接口 通过Runnable接口实现多线程

    (1)未使用ThreadLocal :

    代码截图 结果

    (2)使用ThreadLocal :

    代码截图 结果

    2.ThreadLocal 的使用场景:

    用来解决数据库连接、Session管理等。

    相关文章

      网友评论

          本文标题:Java学习day-24:多线程与并发

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