多线程——理论创建篇

虽然千篇一律,但写多线程的时候,必然会从进程和线程的爱恨情仇说起。

概念性东西,理解理解

程序:比如‘’鹅信‘’“”“鹅Q”直接打开是一个指令的集合
进程:一个静态的概念,也可看做执行中的程序。
–进程是程序的一次静态执行过程,占用的是特定的地址空间
–而且一个程序中的每个进程都是独立的,由三个部分组成cpu/data/code
–但是只有进程的话,会有缺点,内存的消耗变大,cpu的负担也会变大(毕竟切换线程的消耗比切换进程的消耗小的多)
线程:是进程中的一个最小执行单位了,“一个单一的连续控制流程”;线程也有人称为“轻量级进程”。
–一个进程中是可以拥有多个并行的线程
–一个进程中开辟了自己的地址空间和资源。进程中的线程共享内存单元,可以访问相同的变量和对象。而且线程会从同一堆中分配对象,进行通信,数据交换,同步等操作
–由于线程之间的通信是在同一个地址空间上进行的,所以不需要额外的通信机制,使得通信更加坚定而且速度也更快
–一个进程中至少有一个线程(是不是感觉很怪异,那么只有一个线程呢,是否可以看做是一个进程)

进程与线程的区别:
从根本上来说
–进程:作为资源分配的单位
–线程:调度和执行的单位
从开销来看
–进程:每个进程都有独立的代码和数据空间(进程上下文),所以进程间的切换会有比较大的开销。
–线程:同一类线程会共享其进程内的代码和数据空间,每个线程有哦独立的运行栈和程序计数器,并且线程切换的开销小
从分配内存的角度
–进程:系统在运行的时候会为每个进程分配不同的内存区域
–线程:线程所使用的资源是它所属的进程的资源,不会为线程分配内存。

实现多线程的三种方式

第一种:
1、继承Thread类
2、必须得重写run方法,写入自己的逻辑
3、在调用线程的时候不要直接调用run方法,而是通过start()方法来进行调用

//进行继承方式实现多线程
public class ThreadT1 extends Thread{
    //重写run方法
    @Override
    public void run() {
        for (int i =0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+"---"+i);
        }
    }

    public static void main(String[] args) {
        new ThreadT1().start();
        for (int i=0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+"----"+i);
        }
    }

}

第二种:运用了代理设计模式
1、实现了Runnable接口
2、重写run方法
3、创建Thread对象,将Runable的实现子类传入
4,调用Thread对象的start()启动线程

public class ThreadT2 implements Runnable {
    @Override
    public void run() {
        for(int i = 0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+"--xx--"+i);
        }
    }

    public static void main(String[] args) {
        //调用线程
        ThreadT2 t2 = new ThreadT2();
        Thread thread = new Thread(t2);
        thread.start();
        for (int i=0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+"--yy--"+i);
        }
    }
}

//下面俩种留到线程池篇讲解(偷个懒)
第三种:第三种是实现Callable接口重写call()方法,
第四种:通过线程池来创建线程

线程的生命周期

状态图
1、新生状态:
-当通过new关键字,还没有调用线程的start()方法之前。
-新生状态的线程是拥有自己的内存空间的
2、就绪状态:
-调用start()后,准备开始执行,但是还没有开始执行(就好像感觉差一丝那种feel)
-处于就绪状态的线程具备运行条件,未分配到CPU,处于线程就绪队列,等待系统进行分配CPU
3、运行状态:
-当前的进程获取到CPU资源后,就绪队列中的线程就会去抢占CPU资源,谁先抢占到就优先执行谁,在执行的过程中就叫做运行状态
-在运行状态的线程执行自己的run方法中代码,直到等待某些资源阻塞或完成任务死亡
-如果在给定的时间片内没有执行结束,就会被替换下来,回到就绪状态
4、死亡状态:
-死亡状态是线程生命周期中的最后一个阶段,线程死亡的原因有三
-(1)正常运行完毕结束
-(2)线程被强制性终止,例如通过stop方法来终止线程…不推荐
-(3)程序抛出未捕获的异常
5、阻塞状态:
-处于运行状态的线程在某些情况下,执行了sleep()方法,或等待I/0设备等资源,都会让出CPU并暂时停止自己运行,进入阻塞状态
-在阻塞状态的线程不能进入就绪队列,只有当引起阻塞的原因消除时,线程才会转入就绪状态,重新到就绪队列中排队等待,等待被系统调用,从新抢占cpu资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值