并发变成多线程基础(草稿1)

多线程的概念

  • 我们需要了解什么是多线程,同步和异步的概念,线程安全问题,线程之间的通信(wait和notify),jdk1.8的并发包,线程池的原理分析,锁的概念(多种类型的锁)
  1. 线程与进程的概念:
  • 线程就是一条执行路径,进程是一个独立的应用执行程序比如一个.exe程序
  • 多线程不是真正的在一起执行,而是由CPU随机切换不同的进程,时间轮转片切换,单核的情况下其实只能执行一条进程。我们通常认为进程是在同时执行的,其实不是,其实只不过是底层的CPU在快速进行随机切换,只不过切换的时间太短,人没法感知
  • 线程是一条执行路径,进程是一个独立的应用程序,在进程中,会有多个线程,但一个进程至少包含一个线程。进程是线程的集合
  • 电脑的核数与进程也有关,有单核多线程,还有多核多线程,支持几个进程就可以理解为同时执行多少个进程(并行执行,不再是切换)
  • 多线程下载是无法提高下载速度的,但是可以同时下载多个资源。用的都是一个宽带,速度是有上限的,多个线程共享其下载的速度。
  • 线程过多也不是很好,毕竟线程是占用资源的,多线程之间线程的切换也是需要时间的。
  • 多线程的目的是提高程序的效率,避免部分程序阻塞,多线程可以在同一个时刻有多条执行路径,同时执行,目的就是为了提高程序的效率。

第三节

  • 多线程的应用场景:
    (1)迅雷多线程下载
    (2)数据库连接池,每一个数据库的连接都是一个独立的线程,且每一个连接都是互不影响的。目的就是为了提高程序的效率
    (3)分批发送短信

  • 线程分类,分为用户线程和守护线程。还可分为主线程,子线程,GC线程

  • 一个进程中至少有一个线程,是主线程

  • 多线程的创建方式
    (1)extends Thread 重写其run方法
    (2)实现Runnable接口,重写其run方法。

Thread t = new Thread(实现的Runnable接口的类的对象);
t.start();

注意:因为Thread实际上也是实现了Runnable接口,所以,Thread类的构造中也可以直接传递Thread对象。

  • 单线程的特征是:代码从上向下执行,顺序执行。
    -在这里插入图片描述
    方法一如果死了,不继续向下执行。

  • 同步概念:代码从上向下执行,代码执行有顺序,顺序执行

  • 异步概念:代码的执行顺序不固定,不是桉顺序执行,异步采用多线程来实现。开辟一个新的执行路径进行执行。
    在这里插入图片描述
    异步执行的时候方法一 和方法二互不影响。都在自己独立的线程中执行。如果不涉及守护线程,则两个线程互不影响。相互独立,但是有可能操作同一个变量,如堆,方法区中的变量

  • 异步和多线程:概念类似,有多线程的时候肯定就是异步执行的,多线程包含异步概念,

  • 匿名内部类创建线程

new Thread001(
	new Runnable(){
		public void run(){
			// 线程的执行代码
		}
	}
).start();

注意:
如果不是守护线程,主线程中创建子线程,主线程执行完毕,子线程也会继续执行,直至执行结束。线程之间互不干扰,不受影响。

第七节

  • 多线程的运行状态:
    在这里插入图片描述
    多线程的五种状态:
    (1)新建状态,线程创建的时候,即new的时候是新建状态
    (2)就绪状态,线程对象调用start的时候就是就绪,调用start方法后线程并不会立刻执行,等CPU分配执行权,此时就是就绪状态
    (3)阻塞状态,调用wait/sleep,或者请求被已经占用的同步锁的时候等,此时线程就会从运行状态变为阻塞状态,当阻塞状态完毕的时候,线程会进入就绪状态而不是运行状态。直至等CPU再次将其唤醒执行,才是进入运行状态。
    (4)运行状态,调用start()进入就绪状态后,当CPU将其执行,即执行其run方法的时候,就是运行状态
    (5)死亡状态,当线程执行完毕,或者其他情况退出线程的情况下就是死亡状态

第八节

  • 守护线程
    和主线程相关,一般来说我们自己创建的线程叫做用户线程,如果主线程停止掉了,他不会影响到用户线程。但是如果是守护线程,当主线程结束的时候,用户线程也会停止。 用户线程只要创建成功,就和主线程没有关系(用户线程也叫非守护线程)。在JAVA中除了主线程还有一个线程叫做GC线程,其GC线程就是一个守护线程,主线程只要死掉,GC就没有必要继续,也应该随着主线程的死亡而终止。
    守护线程的特征:随着主线程一起销毁。
    在start之前,线程对象.setDaemon(true);此时就是一个该线程对象代表的就是一个守护线程

第九节

  • join方法
    A.join();表示的是当前线程需要等待A线程执行完毕后,当前线程才可以继续执行,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值