【搞定携程】并发与多线程

 

并发

 

某个时间段内,多任务交替处理的能力。

 

并行

 

同时处理多任务的能力

临界区

临界区用来表示一种公共资源(或者说共享资源),可以被多个线程使用。但是每次只能有一次线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源就必须等待资源被释放。在并发程序中,临界区资源是被保护的对象。

 

 

一、线程安全

线程

  • 线程是CPU调度和分派的基本单位,作用是提高任务的平均处理速度。
  • 线程拥有自己的操作栈、程序计数器、局部变量表等资源,与同一进程内的其他线程共享该进程的所有资源。
  • 多线程可能造成的问题:占用内存、资源竞争产生死锁。
  • 合适的线程数才能让CPU资源被充分利用。

线程的生命周期(五种状态)

1.NEW:新建状态,线程被创建尚未启动的状态

  • 三种创建方式

2.RUNNABLE:就绪状态,调用start()之后运行之前的状态

  • 线程的start()不能被多次调用

3.RUNNING:运行状态,是run()正在执行时线程的状态

  • 线程可能会由于某个因素而退出RUNNING,如时间、异常、锁、调度等

4.BLOCKING:阻塞状态,进入此状态,有以下几种情况

  • 同步阻塞:锁被其他线程占用
  • 主动阻塞:调用Thread的某些方法,主动让出CPU执行权,比如sleep()、join()等
  • 等待阻塞:执行了wait()

5.DEAD:终止状态,是run()执行结束,或因异常退出后的状态,此状态不可逆转

创建线程(启动线程)的三种(两种)方式/怎么创建线程

1.继承Thread类重写run()方法

  • 劣势:往往不符合里氏代换原则。不推荐
  • 劣势:任务执行完成后,无法直接获取执行结果,需要借助共享变量等获取

2.实现Runnable接口

  • 优势:可以是编程更加灵活,对暴露的细节比较少,让使用者专注于实现线程的run()方法上。
  • 劣势:任务执行完成后,无法直接获取执行结果,需要借助共享变量等获取
  • 劣势:只有通过setDefaultUncaughtException()的方式才能在主线程中捕捉到子程序异常

3.实现Callable接口

  • 可以通过call()获得返回值。Callable和Future很好的解决了这个问题,可以获得执行结果
  • call()可以抛出异常

Thead类中的方法

Runnable接口和Callable接口的区别

线程池原理,线程池与直接启动线程的比较

 

 

二、什么是锁

你知道Java中有哪些锁

三、线程同步

四、线程池

五、ThreadLocal

猜你喜欢

转载自www.cnblogs.com/zwhu1216/p/11388197.html