多线程笔记

多线程笔记

1-一些概念

多线程:

  • 指的是这个程序(一个进程)运行时产生了不止一个线程

并行与并发:

  • 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
  • 并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。

同步:

  • Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全,来保证结果的准确。如上面的代码简单加入@synchronized关键字。在保证结果准确的同时,提高性能,才是优秀的程序。线程安全的优先级高于性能。

3-Thread类

3.1 构造方法

// 分配一个新的线程对象。
public Thread()
// 分配一个指定名字的新的线程对象。
public Thread(String name)
// 分配一个带有指定目标新的线程对象。
public Thread(Runnable target) 
// 分配一个带有指定目标新的线程对象并指定名字。
public Thread(Runnable target,String name)

3.2 常用方法

// 设置线程名称
void setName(String name) 
// 获取当前线程名称。
public String getName()
// 导致此线程开始执行; Java虚拟机调用此线程的run方法。
public void start()
// 此线程要执行的任务在此处定义代码。
public void run()
// 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
public static void sleep(long millis)
// 返回对当前正在执行的线程对象的引用。
public static Thread currentThread()

3.3 run start 区别

start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。

run() : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程!

4-线程状态

在这里插入图片描述

5- java实现多线程的四种方式

  • 继承Thread类
  • 实现Runnable接口
  • 实现Callable接口
  • 使用Executor框架创建线程池

其中两个接口实现方式类似,只是callable可以带有返回值,其实也可以说只有3种实现多线程的方式

四种方式的区别

  1. 继承Thread不灵活,因为Java只允许单继承(继承了Thread之后如果再想继承别的类就不可能了),实现Runnable接口避免单继承的局限性。

  2. Callable规定的方法是call(),Runnable规定的方法是run()

  3. Callable的任务执行后可以有返回值,而Runnable的任务是不可以有返回值的

  4. 运行Callable任务可以拿到一个Future对象,表示异步计算的结果,等待计算的完成

    解释:实现Runnable接口,在main函数中执行线程,main线程和Runnable接口所代表的线程的两者执行顺序是不一定的;实现Callable接口,同样在main函数中执行,Callable接口代表的线程会一直运行到直至获取到call()中的返回值才会执行main线程。

  5. 通过Executor来启动线程比使用Thread的start方法更好,更易管理,效率更好。还能避免this逃逸问题

    6-同步代码块

    为了保证每个线程都能正常执行原子操作,Java引入了线程同步机制。
    那么怎么去使用呢?有三种方式完成同步操作:

    1. 同步代码块,synchronized 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。

    2. 同步方法(底层锁是this),在方法上,返回值前加synchronized

    3. 锁机制。

    7-死锁(deadlock)

    所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。

    8-线程池

    线程池的原理 :

    因为创建和销毁线程对象消耗资源太多.为了解决这个问题 ,有了线程池;想将线程池创建出来,里面配置了线程对象,也就是以后一直用这里的线程对象;不用再创建 和销毁 ,因为使用完毕 放回线程池中 需要就去取.

    9-常见的线程池

    1.CachedThreadPool

    可缓存线程池:线程数量无限制,如果线程池内有空闲线程就使用空闲线程执行任务,否则创建新线程

    2.FixedThreadPool

    定长线程池:可控制线程最大并发数,超出的线程会在队列中等待。

    3.ScheduledThreadPool

    定长线程池:支持定时及周期性任务执行

    4.SingleThreadExecutor

    定长线程池:可控制线程最大并发数,超出的线程会在队列中等待。

    3.ScheduledThreadPool

    定长线程池:支持定时及周期性任务执行

    4.SingleThreadExecutor

    单例化线程池:有且仅有一个工作线程执行任务,所有任务按照指定顺序执行,即遵循队列的入队出队规则

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值