JUC并发编程01-基础概念

概念

进程

进程可以视为程序的一个实例,进程就是用来加载指令、管理内存、管理I0

线程

一个进程内可以有多个线程,一个线程就是一个指令流。

        在Java中,线程作为最小调度单位,进程作为资源分配的最小单位,可以说进程是线程的一个容器。

对比
  • 进程基本上相互独立,而线程存在于进程中,进程拥有共享资源,如内存空间,供其内部的线程共享。
  • 进程间通信较为复杂,线程的通信相对简单,可以通过同一个进程的共享资源实现
  • 线程更轻量,线程上下文切换成本一般要比进程上下文切换低。
并发

任务调度器将cpu的时间片(windows下时间片最小约为15ms)分给不同线程使用。(微观串行,宏观并行)

异步调用
  • 从方法调度的角度:不需要等待结果返回,就能继续进行。
  • 多线程可以放方法执行变成异步的,如果在项目中需要读取磁盘文件、视频文件转化等,可以开启一个新线程处理视频转化,避免堵塞主线程。
  • tomcat的异步servlet也是类似的目的,让用户线程处理耗时较长的操作,避免阻塞tomcat工作线程。
new Thread(()-> FileReader.read()).start()

创建线程

创建和运行线程【匿名内部类方式创建】

方法一:用Thread创建线程:需要重写run方法

//创建线程
Thread t = new Thread(){
    @Override
    public void run(){}
};
//给线程起名
t.setName("t1");
//启动线程
t1.start();

方法二:使用Runnable配合Thread(更推荐使用)

把线程和任务(要执行的代码)分开,让代码更为灵活。

Runnable r = new Runnable(){
    @Override
    public void run(){}
};

Thread t2 = new Thread(r,"t2");

t2.start();

Thread与Runnable的关系

  • 用Runnable更容易与线程池等高级API配合。
  • 用Runnable让任务类脱离了Thread继承体系,是种组合的方式,更灵活。

方法三:FutureTask配合Thread

  • FutureTask能够接收Callable类型的参数,用来处理有返回结果的情况。
  • FutureTask是个实现类,实现了RunnableFuture接口,间接实现了Runable接口,并比Runable接口多了一个Future接口。
//创建futureTask对象
FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>{
    @Override
    public Integer call() throws Exception {
        return null;
    }
});
//创建线程
Thread t3 = new Thread(task,"t3");
//启动线程
t3.start();
//获取返回值
task.get();

线程运行

查看和杀死进程

Windows

tasklist 查看进程 taskkill杀死进程

linux

ps命令 (添加grep命令可以更方便的查找) 查看进程

kill 杀死进程

top命令 查看进程信息(每隔一段时间重新采集) top -H -p  4262 查看java进程中的线程信息

线程运行
  • jps命令查看所有Java进程
  • jstrck<PID>查看某个Java进程(PID)的所有线程状态
  • jconsole查看某个Java进程中线程的运行情况(图像界面)

线程运行原理

栈帧debug
  • 每个线程启动后,虚拟机就会为其分配一块栈内存。
  • 每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存。
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。

上下文切换

由于一些原因导致cpu不再执行当前的线程,转而执行另一个线程的代码。

  • 线程的cpu时间片用完
  • 垃圾回收(所有工作线程暂停,由垃圾回收的线程进行垃圾回收)
  • 有更高优先级的线程需要运行
  • 线程自己调用了sleep、yield、wait、join、park、synchronized、lock等方法。

        当上下文切换发生时,需要由操作学习通保持当前线程的状态,并恢复另一个线程的状态,Java中对应的概念就是程序计数器,它的作用时记住下一条jvm指令的执行地址,是线程私有的。(每个线程有自己的程序计数器)

  • 状态包括程序计数器、虚拟机栈中每个栈帧的信息,如局部遍历、操作数栈、返回地址等。
  • 上下文切换频繁会影响cpu性能。
  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值