面试指导----线程 进程 协程

  • 进程是操作系统管理内存和程序的容器
  • 线程是CPU运行的基础单元
  • 协程是用户态的一个运行单元,它标志用户态的运行程序

wait和block的区别

  • wait: 线程运行到某一阶段被执行wait函数之后,就回去竞争某一把锁,如果竞争得到,或者被notify唤醒,该线程就可以继续运行,因此wait状态可以理解我们的运行程序在遇到一些条件的时候,主动去做等待被唤醒的动作.
  • block: 当我的CPU在等待某一个IO进程的时候会进入block(阻塞状态),也就是被IO block

Runnable和Callable的区别

  • 共同点: 都可以是线程运行的函数
  • runnable方法没有返回值,仅仅只定义了一个线程可运行的一个run方法的函数,当线程运行完的时候,无论线程内部的状态怎样,都没有办法通过返回值这样的一个通信机制,将线程内部的变量给返回出来
  • callable方法可以带有一个call方法,对应一个返回值可以将线程局部变量内部的一些方法或者局部变量的一些内容给返回出来
  • 一般来说,如果我们不关注线程内部的一些具体的运行,而仅仅只把它当做一个任务,我们只需要使用runnable方法即可
  • 如果我们需要关注线程内部的一些内容,我们就可能需要callable方法

ThreadLocal变量的作用

ThreadLocal污染的问题

  • http client 每次请求都会对应起一个线程,ThreadLocal顾名思义,表示的是我这个线程专属本地变量的一个形式,也就是说每一次请求都会由这个线程专属的本地线程变量去做对应的操作,另一个线程过来,肯定做的是另一个线程对应的请求,这个时候它访问的就是另一个ThreadLocal变量

  • 一般来说,我们的web容器肯定是带有线程池的,这个时候仍然可能出现不同http client是复用之前的线程,这就是通常所说的ThreadLocal污染的问题

  • 因此 我们在做程序开发的时候都会在线程结束的时候将ThreadLocal变量设置回去

package com.restManager.shop;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName ThreadLocalTest
 * @date 2021/5/18 23:52
 * @Version 1.0
 * @Author ShyBoy
 */
public class ThreadLocalTest {

    static ThreadLocal<Map<String,Object>> threadLocal = new ThreadLocal<Map<String,Object>>(){
        @Override
        protected Map<String, Object> initialValue() {
            return new HashMap<String,Object>();
        }
    };

    //每一个ThreadLocal中都存有自己独有的map,互不影响
    public static void main(String[] args) {
        threadLocal.get().put("demo","11");
        outInfo();

        new Thread(new Runnable() {
            @Override
            public void run() {
                threadLocal.get().put("demo","22");
                outInfo();
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                threadLocal.get().put("demo","33");
                outInfo();
            }
        }).start();
    }
    private static void outInfo() {
        System.out.println(Thread.currentThread().getName()+"   :   "+threadLocal.get());
    }

}

线程池的核心参数

ThreadPoolExecutor:

  • coreSize: 核心线程数 通常也被定义为最小线程数  一般取两倍CPU个数再加1(磁盘数)
  • maxSize: 最大线程数
  • queueSize: 等待队列数
  • keepAliveTime: 空闲线程多久被销毁
  • handler: 拒绝策略,丢弃/丢弃抛异常/调用线程处理/丢弃最前面的任务然后尝试重新执行

核心参数之间的关系(考点)

  • 当我们对应的线程池pool被new出来的时候,我们对应通常来说,它的线程池是一个空的线程池,然后当我有第一个请求被submit到了我这个线程池当中的时候,我们就会将对应开辟一个线程去为它服务,当有第二个请求的时候开辟第二个线程,直到开辟到coreSize的时候(前面的线程没有终止),假设coreSize=10,当有第11 个请求进来的时候,我的线程池会去看,我的之前10个线程是否都在忙,如果有不在忙碌的,则取出线程池中对应的这个线程,为这个请求服务; 如果不存在不在忙碌的线程,线程池会把这个任务扔到queue等待队列中,假设queueSize=20,,(假设前面的十个线程仍然处于忙碌状态,否则直接将非忙碌线程拿出来为这个task服务),且新任务又将等待队列塞满的时候,我们就会尝试开启新的线程,直到开到maxSize,我们对应回去执行拒绝策略handler

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值