zoukankan      html  css  js  c++  java
  • Java多线程基础

    基础

    进程

    • 一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。
    • 一个进程一直运行,直到所有的非守候线程都结束运行后才能结束。

    线程的生命周期

    • 新建状态

      • 一个新产生的线程从新状态开始了它的生命周期。它保持这个状态直到程序start这个线程。
    • 就绪状态

      • 当一个线程等待另外一个线程执行一个任务的时候,该线程就进入就绪状态。当另一个线程给就绪状态的线程发送信号时,该线程才重新切换到运行状态。
    • 运行状态

      • 当一个新状态的线程被start以后,线程就变成可运行状态,一个线程在此状态下被认为是开始执行其任务。
    • 阻塞状态(休眠状态)

      • 由于一个线程的时间片用完了,该线程从运行状态进入休眠状态。当时间间隔到期或者等待的事件发生了,该状态的线程切换到运行状态。
    • 死亡状态(终止状态)

      • 一个运行状态的线程完成任务或者其他终止条件发生,该线程就切换到终止状态。

    创建线程三种方法

    • 实现Runnable接口(最简单)

    • 继承Thread类本身

      • 方法

        • start()
        • run()
    • 通过Callable 和 Future 创建线程

    常见线程方法

    • sleep

      • 当前线程暂停
    • join

      • 加入到当前线程中
    • setPriority

      • 线程优先级
    • yield

      • 临时暂停
    • setDaemon

      • 守护线程

    同步问题

    • 多个线程同时修改一个数据的问题

      • 数据变成脏数据
    • 又称为Concurrency(并发)问题

    • 解决问题

      • synchronized 语句块

        • 当前线程独占对象,直到释放占用
        • 被 synchronized 修饰的,称为线程安全的类
      • Lock


    常见线程安全类

    • Map

      • HashMap

        • 非线程安全
        • 可以存放null
      • HashTable

        • 线程安全
        • 不能存放null
    • 字符串

      • StringBuilder

        • 非线程安全
        • 单线程速度快
      • StringBuffer

        • 线程安全
        • 多线程数据安全
    • List

      • ArrayList

        • 非线程安全
      • Vector

        • 线程安全

    多线程编程

    • 多线程能满足程序员编写非常有效率的程序来达到充分利用CPU的目的,因为CPU的空闲时间能够保持在最低限度。

    • 主要概念

      • 线程同步

        • 互斥同步

          • 一个时间点只允许一个线程访问代码段
        • 条件同步

          • 通过条件变量和三个操作来实现:等待,信号和广播
        • 同步关键字

          • synchronized
      • 线程死锁


      • 线程交互

        • wait

          • 让占有this的线程等待,并临时释放占有
        • notify

          • 通知等待this的线程苏醒,可以继续占有
        • notifyAll()

          • 通知所有等待的线程
      • 线程控制:挂起、停止和恢复

      • 线程池

        • 生产消费模式

          • 对象为一个一个的任务
        • 已创建的线程循环使用

    多线程使用

    • 有效利用多线程的关键是理解程序是并发执行而不是串行执行的。例如:程序中有两个子系统需要并发执行,这时候就需要利用多线程编程。
    • 通过对多线程的使用,可以编写出非常高效的程序。不过请注意,如果你创建太多的线程,程序执行的效率实际上是降低了,而不是提升了。
    • 请记住,上下文的切换开销也很重要,如果你创建了太多的线程,CPU花费在上下文的切换的时间将多于执行程序的时间。
  • 相关阅读:
    Python3---filter,map,reduce
    老男孩-day2作业-计算器
    Python 简易购物系统--老男孩作业
    老男孩-day1作业二
    老男孩-day1作业一
    Axure8.0图片旋转注意
    CentOS6.5部署KVM及实现在线迁移
    CentOS 6.5 安装部署iSCSi共享存储
    CentOS 6.5 安装部署KVM
    CentOS6.5部署L2TP over IPSec
  • 原文地址:https://www.cnblogs.com/fengda1/p/14729230.html
Copyright © 2011-2022 走看看