线程————Java重点之一

线程

  1. 基本概念

    在讲线程之前,先介绍进程和程序是什么?很多面试题都有进程和线程的区别。
    程序是计算机指令的集合,它以文件形式存储在磁盘上,而进程就是一个执行中的程序,每个进程都有其独立的内存空间和系统资源。
    然而进程与线程的区别是什么?
    概念:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。
    所处环境:在操作系统中能同时运行多个进程(程序),而 在同一个进程中有对各线程同时执行。
    包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
    开销方面:线程执行开销小,但是不利于资源的管理和保护。进程执行开销大,但能很好的进行资源管理和保护。
    用法:对资源的管理和保护要求高,不限制开销和效率时,使用多进程。要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。
    多线程:是指单个程序可通过同时运行多个不同的线程,以执行不同任务。

  2. 线程的创建
    线程创建有两种方法:
    1)通过实现Runnable接口的方式
    public interface Runnable{
    public abstract void run();
    }
    只要实现了这个接口的类,才有资格调用线程
    class A implements Runnable{
    public void run(){}
    }
    Thread t=new Thread(new A( ));
    runnable 对象是指实现了Runnable接口的对象。当线程执行时, runnable 对象中的run()方法会被调用。然而还得调用Thread类的方法。
    t.start();
    2)通过继承Thread类
    Thread类本身也实现了Runnable接口,所以只要让一个类继承Thread类,并覆盖run()方法,也会创建线程。
    class A extends Thread{
    public void run(){}
    }
    调用: A a=new A();
    a.start();
    两种创建方法的比较:
    1)Runnable接口可以避免单继承的局限性,尽可能去使用Runnable接口去实现多线程机制;
    2)Runnable的代码可以被多个线程共享(Thread实例),适合于多个多个线程处理统一资源的情况。
    3)实现Runnable的方式启动多个进程,他们可以共同操纵同一对象,实现资源的互斥共享。

  3. 线程的状态
    线程包括五种状态:新建、就绪、运行、阻塞和死亡。
    新建状态:线程对象(通过new关键字)已经建立,在内存中有一个活跃对象,但是没有启动该线程,所以不能做任何事情,此时线程处在新建状态。
    就绪状态:一个线程一旦调用了start()方法,便就处于就绪状态。此时线程等待CPU时间片,一旦获得CPU时间周期线程就可以执行。
    运行状态:一旦处于就绪状态的线程获得CPU执行周期,就处于运行状态,执行多线程代码部分的运算。
    阻塞状态:该状态下线程无法运行,必须满足一定条件下后才可执行。如果线程处于阻塞状态,JVM的调度机不会为其分配CPU周期。而一旦线程满足一定的条件就解除阻塞,线程处于就绪状态。发生线程阻塞的情况:
    1)线程正等待一个输入、输出操作;
    2)线程调用了wait()或sleep()方法;
    3)调用了线程的suspend()方法;
    4)线程需要满足某种条件才可以继续执行;
    死亡状态:线程一旦退出run()方法就处于死亡状态。

  4. 线程的使用
    1)线程的优先级:public final void setPriority(int newPriority);来设置其优先级。
    2)线程的休眠与唤醒:
    休眠是指线程暂时处于等待的状态,需要调用Thread类的sleep()方法;
    唤醒需要用interrupt()方法来唤醒线程。
    3)线程让步:就是使当前正在运行的线程对象退出运行状态,让其他线程运行。通过调用yield()方法来实现,但是这个方法不能将运行圈让给指定的线程,只是将运行权让出来,至于给谁,就得看哪个线程抢占到了。
    4)线程同步:就是协同步调,按预定的先后次序进行运行。
    详文可以参考:线程同步
    注:ThreadLocal用于线程间的数据隔离,而Synchronized用于线程间的数据共享。
    ThreadLocal继承Object,没有实现任何借口,并不是一个Thread,而是Thread的局部变量。ThreadLocal定义了一个哈希表用于为每个线程都提供一个变量的副本。

  5. 线程的死锁
    死锁产生的原因:资源的竞争、进程推进顺序非法。
    死锁产生的必要条件(缺一不可):
    1)互斥条件:指进程对所分配的资源不允许其他资源访问。若有其他资源访问就只能等待,直至占据该资源的进程使用结束并释放。
    2)请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放
    (3)不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放
    (4)环路等待条件:是指进程发生死锁后,必然存在一个进程–资源之间的环形链
    处理死锁的基本方法

1.预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件

2.避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁

3.检测死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉

4.解除死锁:该方法与检测死锁配合使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值