zoukankan      html  css  js  c++  java
  • JAVA-线程-学习笔记

    线程
    概述:
    1、进程:当前操作系统执行的任务。
    2、一般而言,现在操作系统都是多进程的。
    3、线程:进程中的子任务。
    4、在实际应用中,都是多线程的场景。
    5、线程本身是CPU上执行,CPU的每一个核在同一时刻内只能执行一个线程,
    但是CPU在底层会对线程进行快速的轮询切换。
    6、每一个进程中至少包含1个线程。
    7、线程在执行任务的过程中大概可以认为分为两大块:
    1、在CPU上执行。
    2、和计算机的硬件进行交互。当线程和硬件进行交互(例如读取文
    件)是不占用CPU的。
    8、多线程的意义:提高CPU的利用率。理论上,当线程个数足够多的时候,
    CPU的利用率是能够到达100%。其实不可能达到100%,只会无限趋近于100%。

    定义线程:
    1、继承Thread,重写run方法,将需要的逻辑放到run方法中,然后创建线程
    对象调用start方法来开启线程。
    (run和start的区别:
    在main方法执行过程中,遇到start方法会开辟一条新的通路执行
    start,同时main方法同步继续执行,因此所有的线程都是同步的。
    run方法,对于main函数而言只是一段程序所需要的逻辑,并不会另
    开新路,走完run内部逻辑之后,才继续执行main函数。

    2、实现Runnable接口。重写run方法,然后利用Runnable对象来构建Thread
    ,然后调用start方法。
    3、实现Callable<T>,重写call方法。

    多线程的并发安全问题:

    1、线程之间是相互抢占执行,而且抢占是发生在线程执行的每一步。
    2、由于线程的抢占而导致出现了不合理的数据的现象-多线程的并发安全问
    题。

    线程中的锁机制:
    1、为了解决线程并发问题,引入了synchronized代码块 - 同步代码块。
    2、同步代码块需要一个锁对象。
    3、锁对象:要求被当前的所有线程都认识---共享资源---方法区中的所有资
    源都可以用来当锁来用。
    4、this作为锁对象的时候,要求传入的必须是同一个Runnable。
    5、同步:在同一时刻内资源/逻辑只被一个线程占用/执行。
    6、在同一时刻内资源/逻辑可以被多个线程抢占使用。
    7、同步一定安全,不安全一定是异步。
    8、死锁:由于多个线程之间的锁形成了嵌套而导致代码无法继续允许,这种
    现象称之为死锁 DeadLock
    9、实际开发中,会做死锁的检验,如果真的出现死锁,会根据线程的优先级
    打破其中一个锁或多个锁。


    线程的优先级:
    1、讲线程的优先级分为了1-10,10个等级。
    2、理论上,数字越大优先级越高,那么抢到资源的概率就越大。
    3、实际上,相邻两个优先级之间的差别不明显;如果想要相对明显一点,至
    少要相差5个优先级。


    等待唤醒机制:
    1、利用标记位以及wait、notify方法来调节线程之间的执行顺序。
    2、wait、notify、notifyAll方法来调节线程之间的执行顺序。
    2、wait、notify、notifyAll和锁有关、用哪个对象作为锁对象使用,那么
    就用锁对象来调用wait、noticy


    线程的状态:
    五种状态:
    创建 阻塞 就绪 运行 消亡

    守护线程:
    1、守护其他的线程,只要被守护的线程结束,那么守护线程就会随之结束。
    2、一个线程要么是守护线程,要么是被守护线程。
    3、守护线程可以守护其他的守护线程。
    4、在java中,最常见的一个守护线程是GC。

    总结:线程产生的场景
    1、系统自启
    2、用户请求
    3、线程之间的启动

    总结:线程销毁场景
    1、寿终正寝。
    2、他杀(被其他线程销毁)。
    3、意外:线程因为报错崩溃而退出。

    总结:
    1、sleep:在使用的时候需要制定休眠时间,单位是毫秒,到点自然醒。 在
    无锁状态下,会释放CPU,在有锁状态下,不释放CPU。sleep方法是设计在了Thread类
    上,所以sleep是个静态方法。
    2、wait:可以指定等待时间,也可以不指定。wait方法是设计在了Object类
    上。如果不指定等待时间,就无限期等待知直到被唤醒。wait必须结合锁来用,当线
    程在wait的时候会释放锁。

    扩展:方法区和线程
    1、类是存储在方法区中,方法区是被所有的线程共享的空间。
    2、每一个线程独有一个栈内存。

  • 相关阅读:
    Androidstudio 使用git插件提交代码
    androidstudio上传代码到git上
    tcpdump的简单使用
    使用nmap工具查询局域网某个网段正在使用的ip地址
    网段的划分
    jenkins配置源码管理git
    shell条件测试test
    shell简单用法笔记(shell中数值运算)二
    shell简单用法笔记(一)
    如何解决audiodg占用内存高(停止与重启audiodg服务)
  • 原文地址:https://www.cnblogs.com/xiaoluohao/p/11461701.html
Copyright © 2011-2022 走看看