JDK

#2020征文-开发板# 用鸿蒙开发AI应用(三)软件篇

冷暖自知 提交于 2021-01-13 15:37:19
目录: 前言 HarmonyOS 简介 DevEco Device Tool(windows下) 获取源码(切换到ubuntu) 烧录程序(切换回windows) 前言 上一篇,我们在 Win10 上用虚拟机安装了 Ubuntu,并设置了文件共享。这一篇,在此基础上编译鸿蒙os的源码,并进行设备烧录。 HarmonyOS 简介 1. 系统定义 HarmonyOS是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。在传统的单设备系统能力的基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持多种终端设备。 2. 技术架构 HarmonyOS整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统 > 子系统 > 功能/模块”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或功能/模块。 这次开源的内核仅包含HarmonyOS微内核的部分,Linux内核要等下一个版本。 3. 分布式软总线 分布式软总线是多种终端设备的统一基座,为设备之间的互联互通提供了统一的分布式通信能力,能够快速发现并连接设备,高效地分发任务和传输数据。 4. 分布式设备虚拟化 分布式设备虚拟化平台可以实现不同设备的资源融合、设备管理、数据处理,多种设备共同形成一个超级虚拟终端

Java多线程系列--“JUC集合”之 ArrayBlockingQueue

故事扮演 提交于 2021-01-13 15:36:55
ArrayBlockingQueue介绍 ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。 线程安全是指,ArrayBlockingQueue内部通过“互斥锁”保护竞争资源,实现了多线程对竞争资源的互斥访问。而有界,则是指ArrayBlockingQueue对应的数组是有界限的。 阻塞队列,是指多线程访问竞争资源时,当竞争资源已被某线程获取时,其它要获取该资源的线程需要阻塞等待;而且,ArrayBlockingQueue是按 FIFO(先进先出)原则对元素进行排序,元素都是从尾部插入到队列,从头部开始返回。 注意: ArrayBlockingQueue 不同于 ConcurrentLinkedQueue , ArrayBlockingQueue 是数组实现的,并且是有界限的;而 ConcurrentLinkedQueue 是链表实现的,是无界限的。 ArrayBlockingQueue· 原理和数据结构 ArrayBlockingQueue 的数据结构,如下图所示: 说明: 1. ArrayBlockingQueue继承于AbstractQueue,并且它实现了BlockingQueue接口。 . ArrayBlockingQueue内部是通过Object[]数组保存数据的,也就是说ArrayBlockingQueue本质上是通过数组实现的

Java编程思想

[亡魂溺海] 提交于 2021-01-13 15:23:32
前言 Q: 为什么学习并发? A: 到目前为止,你学到的都是有关顺序编程的知识,即程序中的所有事物在任意时刻都只能执行一个步骤。 A: 编程问题中相当大的一部分都可以通过使用顺序编程来解决,然而,对于某些问题,如果能够并行地执行程序的多个部分,则会变得非常方便而且很有必要。 A: 并发编程可以使程序执行速度得到极大的提高,或者为设计某些类型的程序提供更易用的模型,或者两者皆有。 A: 另一个问题你必须意识到,当并发执行的任务彼此开始相互干涉时,实际的并发问题就会接踵而来。实际上你可能无法编写出能够针对你的并发程序生成故障条件的测试代码。所产生的故障经常是偶尔发生,并且经常是以客户抱怨的形式出现,这就是为什么要学习并发的强烈理由:如果视而不见,你就会遭其反噬。 A: 有很多Java程序,要么只是偶尔工作,要么在大多数时间里工作,并且会由于未发现的并发缺陷而时不时地神秘崩溃,有时这种崩溃是温和的,但有时却意味着重要数据的丢失,并且如果没有意识到并发问题,你可能最终会认为问题出在其他什么地方,而不在你的软件中。基本上,了解并发可以使你意识到明显正确的程序可能会展示出不正确的行为。 并发的多面性 Q: 如何理解并发的多面性? A: 并发编程令人困惑的一个最主要原因是:使用并发时需要解决的问题有多个,而实现并发的方式也有多重,并且在这两者之间没有明显的映射关系

Java多线程优化方法及使用方式

本小妞迷上赌 提交于 2021-01-13 07:19:00
一、多线程介绍   在编程中,我们不可逃避的会遇到多线程的编程问题,因为在大多数的业务系统中需要并发处理,如果是在并发的场景中,多线程就非常重要了。另外,我们在面试的时候,面试官通常也会问到我们关于多线程的问题,如:如何创建一个线程?我们通常会这么回答,主要有两种方法,第一种:继承Thread类,重写run方法;第二种:实现Runnable接口,重写run方法。那么面试官一定会问这两种方法各自的优缺点在哪,不管怎么样,我们会得出一个结论,那就是使用方式二,因为面向对象提倡少继承,尽量多用组合。 这个时候,我们还可能想到,如果想得到多线程的返回值怎么办呢?根据我们多学到的知识,我们会想到实现Callable接口,重写call方法。那么多线程到底在实际项目中怎么使用呢,他有多少种方式呢? 首先,我们来看一个例子:   这是一种创建多线程的简单方法,很容易理解,在例子中,根据不同的业务场景,我们可以在Thread()里边传入不同的参数实现不同的业务逻辑,但是,这个方法创建多线程暴漏出来的问题就是反复创建线程,而且创建线程后还得销毁,如果对并发场景要求低的情况下,这种方式貌似也可以,但是高并发的场景中,这种方式就不行了,因为创建线程销毁线程是非常耗资源的。所以根据经验,正确的做法是我们使用线程池技术,JDK提供了多种线程池类型供我们选择,具体方式可以查阅jdk的文档。  

Java虚拟机(六):JVM调优工具

可紊 提交于 2021-01-13 03:51:49
工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题,长长可以到达事半功倍的效果来。 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具。jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工具已经很强大,几乎涉及了方方面面,但是我们最常使用的只有两款:jconsole.exe和jvisualvm.exe;第三方的分析工具有很多,各自的侧重点不同,比较有代表性的:MAT(Memory Analyzer Tool)、GChisto等。 对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现。JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。其中VisualVM和MAT是dump文件的分析利器。 jdk自带的工具 jconsole Jconsole(Java Monitoring and Management Console)是从java5开始

Gradle安装

女生的网名这么多〃 提交于 2021-01-13 03:38:54
1.开发环境 (1)Java: JDK 8(必须是JDK或JRE7以上,使用java -version查看当前电脑java版本) (2)操作系统:Windows 7 2.安装步骤 (1)下载最新的Gradle压缩包 Gradle官网:https://gradle.org/ 当前最新版本下载地址:https://gradle.org/releases/,下载binary-only即可 (2)解压下载的压缩包到指定位置,比如: C: \Gradle\gradle-4.3.1 (3)配置环境变量 右键计算机->属性->高级系统设置->环境变量,在系统变量区域,点击新建,输入变量名为:GRADLE_HOME,变量值为:D:\Software\Gradle\gradle-4.3.1(根据实际情况)。找到Path,在原始内容基础上加入%GRADLE_HOME%\bin;,必须以分号结束 (3)测试配置是否成功 打开一个新的cmd命令窗口或者powershell或者其他命令行工具(比如cmder),输入命令gradle -v,如果出现类似下面的消息,则说明配置成功 C:\Windows\System32>gradle -v ------------------------------------------------------------ Gradle 4.3.1 -------------

Java多线程入门2

三世轮回 提交于 2021-01-13 00:33:35
线程死锁简单示例 package second.study; public class Test { public static void main(String[] args) { Thread thread1 = new Thread( new DeadLock( true )); Thread thread2 = new Thread( new DeadLock( false )); thread1.start(); thread2.start(); } } class DeadLock implements Runnable { private boolean flag; DeadLock( boolean flag) { this .flag = flag; } @Override public void run() { if (flag) { while ( true ) { synchronized (Lock.obj1) { System.out.println( "if Lock1" ); synchronized (Lock.obj2) { System.out.println( "if Lock2" ); } } } } else { while ( true ) { synchronized (Lock.obj2) { System.out.println(

JDK和CGLIB动态代理区别

徘徊边缘 提交于 2021-01-12 23:05:23
背景:虽然自己了解这两种代理的区别,但是面试时候还是答的很模糊,需要好好总结。 前言 JDK动态代理实现原理(jdk8): https://blog.csdn.net/yhl_jxy/article/details/80586785 CGLIB动态代理实现原理: https://blog.csdn.net/yhl_jxy/article/details/80633194 定义 JDK动态代理 利用拦截器(拦截器必须实现 InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类 , 在调用具体方法前调用InvokeHandler来处理。 CGLiB动态代理 利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理 。 实现CGLIB动态代理必须实现 MethodInterceptor (方法拦截器)接口 区别 jdk只能针对接口不能针对类实现代理。 CGLib通过继承方式实现代理。所以类或方法最好不要声明成final,对于final类或方法,是无法继承的。 Spring如何选择用JDK还是CGLiB? 1)当Bean实现接口时,Spring就会用JDK的动态代理。 2)当Bean没有实现接口时,Spring使用CGlib是实现。 3)可以强制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy

静态代理,jdk动态代理以及Cglib区别

我们两清 提交于 2021-01-12 19:58:01
众所周知,Spring AOP中涉及到了动态代理模式,那么有动态代理相应的就会有静态代理。那么动态代理分为哪几种,相对应的区别又是什么呢? 首先什么是代理? 找一个东西或者一个人去帮你做事,比如常说的中介就是一个代理,各大经销商的代理商等等。JAVA中的代理即是指将自己的事情委派给别人帮忙去完成。 静态代理:代理的是程序员已经创建好的类,也就是说当前仅有一个对象能被成功代理。上代码看下 首先是一个需要代理的接口类 该类描述了两个方法,一个是eat(),一个是run(); public interface UserAction { void eat(); void run(); } 接下来是该类的实现类,较为简单的实现方式,仅仅打印内容而已。 public class UserActionImpl implements UserAction { @Override public void eat() { System.out.println("吃饭"); } @Override public void run() { System.out.println("跑步"); } } 接口已经实现完成,剩下的即是代理对象了。上述的过程中静态代理和JDK的动态代理还没有区别。区别在于下面 public class UserActionStaticProxy implements

垃圾收集器

淺唱寂寞╮ 提交于 2021-01-12 18:18:45
GC概念   如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。   GC(Garbage Collection)的工作任务可以分为两类:内存的动态分配和垃圾回收。在内存执行分配之前,GC会先对内存进行划分区域,在上一篇博客中我们知道Java虚拟机使用了分代收集算法,所以堆区里面会被分为新生代和老年代两个区域,新生代又分为Eden空间、From空间和To空间。 空间划分完成后,GC就可以为新对象分配内存空间。   在JDK版本这么多年发展的途中,垃圾收集器也已经出现了多种版本,基于分代的概念,不同的分代空间中活动着不同的GC。   从不同的角度分析垃圾收集器,可以将GC分为不同的类型。 按照线程数分,可分为串行垃圾回收器和并行垃圾回收器。 按照工作模式分,可分为并发式垃圾回收器和独占式垃圾回收器。 按碎片处理方式分,可分为压缩式垃圾回收器和非压缩式垃圾回收器。 按工作内存分,可分为新生代垃圾回收器和老年代垃圾回收器。 下面简单介绍这几个概念 并发式回收器和独占式回收器   并发式垃圾回收器与应用程序线程交替工作,以尽量减少程序的停顿时间。   独占式回收器(Stop the world)一旦运行,就会停止应用程序中的其他所有线程,直到垃圾回收完全结束。 串行回收器和并行回收器   串行回收器是所有垃圾回收器中最古老的的一种