JAVA高并发之线程的概念

在这里插入图片描述

  1. 进程与线程的区别?

    进程是一个执行单元
    每个进程内至少有一个线程、线程是进程的执行路径,线程也称为轻量级进程

  2. 线程的状态(生命周期)

    NEW ----创建一个线程、此时线程尚未被启动,未调用start()方法
    RUNNABLE -----调用了start()方法、等待CPU轮询调度轮询此任务线程
    RUNNING -----此时CPU轮询到此线程、线程开始执行
    BLOCKED -----此时线程进入锁状态、调用了Thread.sleep()、Object.wait()方法等
    TERMINATED -----线程最终状态、正常结束任务、或者异常结束

  3. 线程的启用方式

    继承Thread类、重写run方法、调用start()启动一个线程
    实现RUNNABLE接口的run方法、(主要用于实现共享数据),启用线程的方式就只有构造Thread一种、实现线程的执行单元有两种、执行单元则为run();

  4. 线程中run()和start()的方法的区别

    Thread.run()是线程的执行单元
    Thread.start()启动线程的方式

  5. 线程中监控工具

    jconsole与jstack查看线程状态
    在生产者消费者模式中,建立线程池,可以通过Jstack命令
    jstack ,
    (1)jps查询到当前线程号,
    (2)jstack pid > ./dump名称,
    (3)查看dump文件查看Waiting的线程在做什么 查看所有线程状态:jstack pid |grep java.lang.Thread.State|awk ‘{print 22234445}’ |uniq -c 统计当前线程下所有状态

  6. 为什么要使用多线程?多线程中面临的挑战是什么?(多线程名称解析)

    并发编程中是为了让程序更快的得到执行、而不是启动更多的线程取处理问题

  7. 上下文切换

    上下文切换:即使是单核处理器也支持多线程程序、CPU会给每个线程分配时间片、cpu在不停的轮换线程、每次轮换都会记录切换前的状态、时间片一般为几十毫秒。
    单线程不一定会比多线程慢、如果数据量比较小的情况下、由于频繁的上下文切换、可能会导致单线程时间小于多线程处理时间
    测试上下文切换次数与时间的工具、Lmbench3测试上下文时长、vmstat命令可以测试上下文切换的次数

  8. 如何减少上下文切换

    无锁并发编程、(多线程竞争锁的时候,会频繁的引起上下文切换)
    CAS算法
    使用最少线程,避免创建不需要的线程、比如任务很少、但是缺创建的很多线程来处理
    协程:单线程实现多任务的调度、并在单线程里维持多个任务间的切换。

  9. 减少上下文切换实际操作

    通过jstack查看处于waiting状态的闲置线程、然后在线程池设置中调整最大线程数,(减少最大线程数)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值