JAVA #(三)线程,流,容器和接口

【系列】重新认识Java——容器体系(Collection) Java中的容器在开发过程必然会接触到的,也是作为一名合格的Java程序员必须要掌握的内容。各种面试、笔试中十有八九都会在容器上面做“文章”。由于每一类容器涉及的知识点都比较多,基于单一职责原则,本文并不会对特定容器做特别深入地介绍。文章在宏观层面上来研究一下Java中的容器体系,并比较各种容器之前的联系与区别,主要内容如下: Java容器的体系结构 Collection体系 Map体系 容器的体系 阅读详情

线程

def:线程是一个程序里的不同执行路径,(两块代码可以同时宏观执行)
使用:

  • 继承Thread类后,对run()方法进行重写
  • 或者实现runnable接口,实现run()方法
  • 调用start()方法
    tips:
    1.执行线程就是执行run()方法中的代码,一个对象只有一次start方法
    2.start()方法就是创建一个新线程,并自动调用该线程的run()方法

大体实现代码:

class A implements Runnable{
	...//实现了run方法
}
class B extends Thread{
	...//重写了run方法
}
A aa = new A();
Thread t = new Thread(aa);//构建线程对象必须要用runnable类型的对象作为参数
t.start();
//aa.start();//error,因为只有线程类才能调用start方法
B bb = new B();//本身已经继承线程,那么就是自己线程类
bb.start();//ok,线程自己start

常用方法

  • public final void setName(String name);//设置线程的名字
  • public static Thread currentThread();//返回执行线程类对象的引用
  • public final String getName();//返回线程的名字
  • Thread.currentThread().getName();//返回谁在执行线程
public class test {
    public static void main(String[] args) {
        A a1 = new A();
        a1.setName("a1");
        a1.start();
        A a2 = new A();
        a2.setName("a2");
        a2.start();
        A a3 = new A();
        a3.setName("a3");
        a3.start();
        //第一句输出一定是main
        System.out.println(Thread.currentThread().getName());
    }

}

class A extends Thread{

    @Override
    public void run() {
        super.run();
        System.out.println("正在执行:"+ Thread.currentThread().getName());
    }
}

线程控制的相关方法:

  • isAlive() //判断是否活着
  • getPriority() //获得优先级
  • setPriority() //设置优先级
  • ThreadSleep() //设置阻塞
  • join() //合并线程,把当前执行的线程暂停
  • yield() //设置为就绪状态
  • notify() //激活线程
    tips:线程是不能抛出异常的

线程同步问题:

public class test {
    public static void main(String[] args) {
        B b = new B();
        Thread t1 = new Thread(b);
        t1.start();
        Thread t2 = new Thread(b);
        t2.start();

    }

}

class B implements Runnable{
    private static int ticketNum = 100;
    private static String str = new String("123");
    @Override
    public void run() {
        while (true){
            synchronized (str){
                if(ticketNum > 0){
                    System.out.printf("%s线程正在卖第%d张票\n",Thread.currentThread().getName(),ticketNum);
                    ticketNum--;
                }else {
                    break;
                }
            }

        }
    }
}

若不限制代码互斥,就可能出现并发错误
synchronized(对象名a){代码块A}
其含义是:本线程判断a是否被其它线程占用,若是被占用那么本线程进入等待状态;若a没有被占用,那么就占用此对象并执行代码块A;在当前线程执行代码块A途中其它线程无法再执行代码块A,当本线程被执行完代码块的时候会释放a,让其它线程去竞争,CPU最终会选择其中一个进行执行.

流

**什么叫流:**用于数据传输的类,是数据的管道(只有数据通过它才能进行传输)
**流和类的关系:**流是一种类,用作于设备和程序之间的数据传输.
**原始流:**是数据源和数据的读写方法.
**原始流和包裹流的关系:**包裹流是依托与原始流.
流的分类:
1.四大基本流
字节流:InputStream/OutputStream
字符流:Reader/Writer
2.文件流:File+(四大基本流)

  • InputStream常用方法:
    public int read();
    public int read(byte[] b);
    public int read(byte[] b,int off,int len);
    public void close();
  • OutputStream常用方法:
    void write(int b);
    void write(byte[] b);
    void write(byte[] b,int off,int len);
    void close();
    void flush();
  • Reader常用方法:
    int read();
  • Writer常用方法:
    void write();

3.缓冲流:带有缓冲区的流;等价于Buffer+四大基本流
public BufferedInputStream bis;
public BufferedOutputStream bos;
public BufferedReader br;
public BufferedWriter bw;
4.数据流:
能够以一种与机器无关的方式直接将java中的基本类和String类型 的数据写到字节输出流,属于包裹流.
本质是一个数组和字节输入/出流.
可以实现其它类型转换为byte类型的数据流.
public ByteArrayInputStream bais;
public ByteArrayOutputStream baos;
5.转换流:
System.in是字节输入流(InputStream)的子类.
InputStreamReader可以将Inputstream转换为Reader类.
可以得到:基本流+Reader类可以实现将基本流转换为Reader流
6.print流
print流只有输出,没有输入.
printStream在基本字节输出流的基础上提供了增强功能,可以方便地输出各种类型的数据,比数据输出流只能输出Byte流更强,不限于byte
7.实现对象序列化的流
ObjectOutputStream
ObjectInputStream
可以将对象(Object)直接转换成字节流后直接写入硬盘或网络中.
tips:要实现序列化必须实现serializable接口
各类型流的基本应用
public static void main(String[] args) throws IOException {

    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\Acos\\Pictures\\chrome.ico"));
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\Temp\\streamTest.png"));
    
    byte[] buffer = new byte[1024];
    int len = bis.read(buffer);
    while (-1 != len){
        bos.write(buffer,0,len);
        len = bis.read(buffer);
    }
    bos.flush();
    bos.close();
    bis.close();
}

容器Iterator

定义:
能够放入很多不同类型对象的对象,不是数组,又称集合;
可以代替数组,弥补数组的长度难扩充,类型必须相同的缺点.
Iterator的方法
boolean hashNext();//判断当前游标后面是否有元素
Object next();//返回当前游标右边的元素
void remove();//删除最近返回的元素
容器的数学分类:

  • set:元素无序,不重复
  • list:元素有序,允许重复
  • map:保存成对的键值对,一个元素一个键值对,一个键映射一个值
    容器的继承关系:
    Iterator:Collection,Map ||这一层全是接口
    Collection:set,list ||下面是实体类
    set:hashset
    list:linklist,arraylist ||两者都实现了list接口,但是前者底层是双向链表,后者是数组
    Map:hashmap

Collection的常用方法:

  • sort(list);//双轴快速正向排序list中的元素
  • reverse(list);//倒序list
  • fill(list,object);//将list填满object
  • binarySearch(list,object);//折半查找,在list找object

hashcode()方法与equals()方法介绍:
将对象放入hashset容器:
1.hashcode()方法决定元素放入容器时的hashcode
2.equals()方法决定,当对象的hash相同时,后面的元素相同与否
tips:注意原本的hashcode()方法与equals()方法原本的判断依据是对象的地址,当我们直接定义类时,最好重写一下hashcode()和equals()方法,改变其的判断依据达到我们想要的效果(比如改变判断依据是对象的值).

HashMap:
几个概念:
1.哈希表:保存数据的主键,用算法计算出以当前主键为主键的数据存储的位置,将数据保存到当前位置上.
tips:哈希表中不允许重复的键
2.映射(map):将键和键值映射的集合,每个元素都包含一对键对象和值对象.

实现HashMap(K,V)的遍历:

	HashMap hm = new HashMap();//创建hashMap
	Set<Intager> s = hm.keySet();//获得hashMap的键值,组成集合
	Iterator<Intager> it = s.iterator();//对接口的类型进行指定
	while(it.hashNext()){
		Intager Key = (Intager)it.next();
		System.out.println(hm.get(Key));
	}

泛型:
在容器的基础上,限定进入容器的数据类型;
表现形式为"<数据类型>"
比如ArrayList list = new ArrayList();//list只能够放入String类型

20220513周测 目录 一、单选题 动态创建数组 声明了注解类型 append为true表示追加 File file = new File(“chp13/corejava.txt”); 运行多个服务,服务用什么来区别 404 RandomAccessFile类和File类无关 Java语言中支持UUID的类在哪个包里 String类不可变 length和length() substring() 声明注解中的属性 getAnnotation() finalize()方法的正确形式 显式释放掉.. 阅读详情

相关推荐

Java容器监控的5大“致命盲区”:你真的看清了吗?

摘要: Java容器监控常因堆外内存泄露、CPU争抢、GC停顿、线程泄漏及安全漏洞等盲区导致生产事故。本文通过金融、电商等真实案例,揭示五大监控陷阱:1)未监控堆外内存引发OOM;2)无CPU配额导致服务抖动;3)GC停顿未捕获致响应延迟;4)线程池泄漏拖垮服务;5)安全漏洞引发数据风险。提出三大解决方案:资源隔离(Cgroups/K8s配额)、JVM调优(ZGC/堆外监控)、全栈监控(Prometheus+JMX),并强调监控铁律——堆外内存>80%、GC停顿>100ms等核心指标必须告警。核

java专栏 1649

Java之多线程流学习总结-概述

要想了解多线程,必须先了解线程,而要想了解线程,必须先了解进程,因为线程是依赖于进程而存在。 1、线程概述     几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程。     当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。 2、线程和进程     几乎所有的操作系统都有进程的概念,所有运行中的任务通常对应一条进

杨书元的博客 501

《Java编程十五讲》第十四讲:Java里提供的常用数据容器框架三

#第十五讲 容器框架三 我们到此已经把ArrayList、HashSet和HashMap讲过了。JDK里面还有一些实现,如Queue、Deque、TreeSet、TreeMap等,我就不一一讲了。现在回顾一下。 Collection保存单一的元素,而Map把保存键值对。用泛型技术,就可以将制订类型的对象放到容器中,不会出现类型错误的元素,取出来的时候也不需要再进行类型转换。 Collection和Map都不定长,向里面添加更多元素的时候,会自动调整容量。 跟数组一样,List维持位置索引和对象的关联,因此是

人邮异步社区 484

Io及多线程

IO流 1.概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流。 流按操作类型分为两种:字节流与字符流。  字节流可以操作任何数据,字符流只能操作纯字符数据,比较方便。 2.IO流常用父类 字节流的抽象父类: InputStream ,OutputSt

小么飞刀的博客 996

人形机器人硬件开发:骨架系统设计全攻略

本文以人形机器人骨架系统为核心研究对象,系统解析其从理论建模到工程实现的全流程设计方法。通过融合刚体力学、材料科学与机器人控制理论,构建"概念基础-理论框架-架构设计-实现机制-实际应用-高级考量-综合拓展"的七层分析体系。重点覆盖运动学/动力学建模、轻量化结构设计、关节模块集成、多物理场耦合优化等关键技术,结合波士顿动力Atlas、本田ASIMO等经典案例,提供从原型设计到量产验证的工程实践指南。

AI天才研究院 1878

Java后端实战:钉钉互动卡片消息从配置到生产级对接

在企业级消息推送场景中,机器人通知已从简单的文本向富交互演进。其核心原理在于通过可交互的卡片模板,将传统单向通知升级为双向、有状态的微型应用界面,实现了用户无需跳转即可完成操作的技术价值。这广泛应用于审批、任务确认、数据填报等需要即时反馈的业务流程。本文聚焦于钉钉平台,深入剖析其互动卡片消息机制,并基于Java后端,系统讲解如何实现包括安全验签、异步回调与卡片动态更新在内的生产级对接方案,涵盖配置管理、服务降级等工程实践关键点,助力构建稳定高效的企业消息交互服务。

weixin_30617737的博客 439

Java之多线程流学习总结-知识点目…

一、线程的概述 二、线程和进程      进程的独立性、动态性、并发性 三、进程的特征 四、并发和并行 五、多线程的优势 六、创建、启动线程 七、线程的实现方式      【初学者重点掌握】继承Thread和实现Runnable接口创建线程的区别      2种方式优缺点 八、线程的生命周期 九、线程的状态      新建 new      就绪 Runable    

杨书元的博客 300

单片机入门说明书:从本质到架构,一文看透MCU核心原理

其实你每天用的洗衣机、刷的智能门锁、开的汽车里,都藏着它的身影。相当于工厂里的“运输轨道”,CPU算出的结果通过总线送到RAM存储,ROM里的程序通过总线传给CPU执行,外设的信号通过总线交给CPU处理,整个过程每秒能重复上百万次,确保各模块协同高效。高端单片机(比如STM32F4系列)还会配备DMA(直接存储器访问)单元,相当于“专用传送带”——不需要CPU干预,就能直接让外设和RAM之间传输数据(比如让ADC采集的温度数据直接存进RAM),大大降低CPU负担,让CPU能专注处理更重要的任务。

IAMIF12的博客 1042

Java_IO流(精讲)包含练习题及答案

1、Java Io流的概念 流:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象。 流的本质:数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。 作用:为数据源和目的地建立一个输送通道 Java IO所采用的模型 Java的IO模型设计非常优秀,它使用Decorator[ˈdekəreɪtə(r)](装饰者)模式,按功能划分Stream[striːm]英[striːm]美,您可以动态装配这些Stream,以便获得您需要的功能。 例如,您需要一个具有缓冲的

红目香薰 2715

FOC实战笔记:RC吸收电路的设计考量与参数调优

本文深入探讨了FOC驱动器中RC吸收电路的设计与调优。针对MOS管开关过程中的电压尖峰问题,详细阐述了RC电路的钳位与能量吸收原理,并提供了从参数计算、实验调试到布局布线的完整实战指南,旨在帮助工程师有效提升系统可靠性与稳定性。

weixin_29219539的博客 276

保姆级教程:用rosbag录制和回放你的第一个ROS机器人数据(附C++/Python代码)

本文提供了一份详细的ROS机器人数据录制与回放教程,涵盖从命令行操作到C++/Python编程实现的全流程。通过rosbag工具,开发者可以高效记录和回放机器人运行时的传感器数据和控制指令,适用于故障复现、算法调试等多种场景。教程还包含高级技巧如时间同步和大文件处理,帮助用户快速掌握ROS数据管理核心技能。

weixin_29313239的博客 285

# Java 并发编程的艺术(三)

如果一个操作另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。两个操作之间存在关系,并不意味着Java平台的具体实现必须要按照关系指定的顺序来执行。如果重排序之后的执行结果,与按关系来执行的结果一致,那么这种重排序并不非法(也就是说,JMM允许这种重排序)。在队列为空时等待从队列中获取元素,或者在队列已满时等待向队列中添加元素阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。

不积跬步,无以至千里;不积小流,无以成江海 944

论文记录:Affine Formation Maneuver Control of Multiagent Systems

多智能体编队控制仿真记录 实现功能:平移/旋转/尺寸缩放/shear,见截图 注意:本仿真图只是起到了演示效果,中间过程速度产生突变,实际中是不允许的。需要进行速度规划,这一点论文中仿真图更为贴合实际。 参考论文:Zhao, S. (2018). Affine Formation Maneuver Control of Multiagent Systems. IEEE Transactions on Automatic Control, 63(12), 4140–4155. 突然发现有个博主写得很好,参考:

W1H1J1的博客 2108

多线程(六)同步容器&并发容器

HashTable底层是通过synchronized关键字来实现的,虽然线程安全,但是在高并发的情况下,效率却超级低,因为当一个线程访问HashTable的同步方法时,其他线程拿不到锁,就访问不了它的同步方法,比如线程1使用HashTable的put方法,其他线程不仅不能使用put,就连get()也被阻塞。,分段式存储数据,然后每一段数据都会加上不同步的锁,所以当其中一条线程访问其中一段数据的时候,其他数据仍然可以被别的线程访问,同时,它的get()方法也是无锁的。,它的底层维护着一个数组的阻塞队列。

mf97532的博客 771

LS-DYNA超高速碰撞仿真入门:从SPH算法配置到铝靶板穿孔分析(附K文件模板)

本文详细介绍了使用LS-DYNA中的SPH(光滑粒子流体动力学)算法进行超高速碰撞仿真的完整流程。以铝弹丸撞击铝靶板为例,从SPH算法原理、LS-PrePost前处理、材料模型与状态方程设置,到接触定义、边界条件及K文件生成,提供了系统的入门指导和关键参数调试经验,帮助工程师高效模拟材料破碎、穿孔等极端变形问题。

h0i1j2k3l的博客 735

姿态传感器/陀螺仪之ICM-42670-P应用原理图设计

ICM-42670-P采用LGA-14封装,尺寸为2.5x3x0.76毫米,工作电压范围为1.71V至3.6V,支持I3CSM、I2C和SPI串行通信接口。其设计目标是提供高精度、低功耗和小型化的解决方案,以满足消费类和工业应用的需求。ICM-42670-P是一款由TDK InvenSense推出的高性能六轴MEMS运动追踪传感器,集成了3轴陀螺仪和3轴加速度计,适用于多种应用场景,包括可穿戴设备、游戏控制器、无人机、AR/VR设备等。

corlin6688的博客 1206

Java # Java容器

一、概览 Collection Set TreeSet: 无序,不可重复,自动排序; 存放在TreeSet中相当于存放到TreeMap的key部分 HashSet: 无序,不可重复,支持快速查找; 存放在HashSet中相当于存放到HashMap中的key部分 LinkedHashSet:基于双向链表实现,具有HashSet的查找效率 List ArrayList: 基于动态数组实现,支持随机访问 增删元素通过移动元素实现,效

xyz_xiaoyuzhou的博客 203

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java基础:Java线程池线程数设置

CPU密集型基准值:CPU核数 + 1优化点:绑定CPU核心、禁用超线程IO密集型基准值:CPU核数 × (1 + IO等待/CPU时间)优化点:Epoll事件驱动、零拷贝技术混合型策略:分级线程池 + 工作窃取工具:JFR分析任务特征容器环境必须考虑cgroup限制建议使用动态调整监控指标:队列等待时间、活跃线程数调整策略:PID控制器算法使用验证JVM实际参数通过jstack定期检查线程状态采用A/B测试验证配置效果建立线程池配置知识库持续优化。

weixin_43290370的博客 1382

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Roson的Qt之旅#72 Qt容器介绍

Qt容器介绍,Qt容器用法,QList,QVector,QMap等

Allen Roson 1361

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java线程池原理剖析和应用指南

目录Java线程池详解一、Java线程池简介池化思想池化思想的优点二、线程池的实现原理分析实现线程池需要考虑哪些问题?线程池的简单使用示例线程池原理的简单图示三、Executor详解Executor简介Executor框架的继承结构总结ExecutorExecutorService四、ThreadPoolExecutor 详解线程池的七个参数线程池的任务调度流程图示WorkThread模式和Future模式线程池的状态和内部结构线程池的关闭线程池的状态转换图工作线程`Worker``execute`方法详解

落日的博客 1800

Java高并发编程基础笔记(锁、并发容器、线程池)

Java锁synchronized关键字锁定临界资源,同步代码块锁定当前的实例对象(注意和类对象进行区分)方法一:同步方法方法二:锁定this锁定类对象(.class对象)方法一:直接锁类对象方法二:锁定类的静态同步方法可重入锁方法一:同步方法互相调用方法二:继承锁与异常volatile关键字 synchronized关键字 目的: 为了保证在多线程环境下的操作的原子性。比如说:多个线程对count进行自增运算,为了保证不会加错,就需要加锁。 注意: 同步方法只会影响其他线程对当前被锁定对象的同步方法的调

qq_42197800的博客 1040

SpringBoot线程池和Java线程池的用法和实现原理

与我们平时写的线程不同,该线程处在一个循环中,并不断地从队列中获取新的任务执行。因此线程池中的线程才可以复用,而不是像我们平常使用的线程一样执行完毕就结束。:如果线程池拒绝了任务,直接将线程池中最旧的,未运行的任务丢弃,将新任务入队。引用线程池时,需要将变量名更改为bean的名称,这样会按照名称查找。是保存待执行的任务的队列,线程池中加入新的任务时,会将任务加入到。),如果有空闲的线程超过需要,则回收,否则重用已有的线程。异常,并指示任务的信息,线程池的信息。单线程线程池,可以实现线程的顺序执行。

Twilight's Blog 1241

理解Java虚拟机#2 Java线程与锁机制

线程是比进程更加轻量级的调度执行单位。 进程是分配资源的单位,各个线程可以共享进程的资源(内存地址等) 线程是调度的最小单位,减少了进程切换的开销 在Java中,每一个执行了start()还未结束的Thread类的实例就代表了一个线程 一、线程的实现 1.1 使用内核线程实现 当程序的线程和内核线程是一对一的关系,程序使用的内核线程的接口叫做轻量级进程(Light Weight Process L...

WchStrife的博客 226

容器隔离 java_容器隔离性带来的问题--容器化Java应用比虚机启动速度慢

# 引发的问题同等配置下,虚机中的java 服务的启动速度,要比容器快很多(将近两倍)#### 实测数据在同是1c1g的虚机和容器中,虚机启动时间大概在1min20s,容器启动时间大概在2min40s。# 排查思路## 怀疑网络最开始怀疑是网络问题,因为业务依赖外部数据库,在容器和虚机中ping、telnet外部数据库,能通而且延迟差不多。咨询熟悉java的小伙伴,说 spingboot可能有潜在...

weixin_35517006的博客 386

Java-常见并发容器-总结

在很多应用场景中,读操作可能会远远大于写操作。由于读操作根本不会修改原有的数据,因此对于每次读取都进行加锁其实是一种资源浪费。我们应该允许多个线程同时访问List的内部数据,毕竟读取操作是安全的。这和我们之前提到过的读写锁的思想非常类似,也就是读读共享、写写互斥、读写互斥、写读互斥。JDK 中提供了类比相比于在读写锁的思想又更进一步。为了将读取的性能发挥到极致,读取是完全不用加锁的,并且更厉害的是:写入也不会阻塞读取操作。只有写入和写入之间需要进行同步等待。这样一来,读操作的性能就会大幅度提升。

Java程序员的知识博客 1174

java 线程组作用_java 线程组

ThreadGroup其实比ExecutorService更好用java做抓取的时候免不了要用到多线程的了,因为要同时抓取多个网站或一条线程抓取一个网站的话实在太慢,而且有时一条线程抓取同一个网站的话也比较浪费CPU资源。要用到多线程的等方面,也就免不了对线程的控制或用到线程池。 我在做我们现在的那一个抓取框架的时候,就曾经用过java.util.concurrent.ExecutorServ...

weixin_27437725的博客 292
上一篇: JavaScript基础整合
下一篇: ES6规范改变
Stock01
博客等级 码龄6年 1粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值