JDK

配置Appium环境避坑指南/为什么需要安装这些环境依赖

拈花ヽ惹草 提交于 2020-08-17 03:38:30
Appium环境安装是最坑的一部分,大多数人会死在安装环境的路上。只要你迈过这个坎,后面的代码编写压根不是事儿 安装环境需要: jdk(建议使用1.8版本) sdk(build-tools建议使用29以下版本) appium-desktop/appium-server+node.js(两者安装其一即可,推荐使用1.15版本) appium-python-client库(pip安装即可) 真机/模拟器 python/java环境(根据选择的语言安装相应的环境) 说一下为什么使用推荐版本,因为build-tools从30开始,appium有些地方不兼容,所以build-tools需要使用30以下版本。30以下版本依赖于jdk1.8,而appium目前最新版本1.17不稳定且部分依赖于jdk1.9,因此使用appium1.15版本为佳。总结:使用上述推荐环境基本不会出现问题。跟哥混,没错的! 再说一下我遇到过的坑,使用uiautomatorviewer.bat程序一闪而过,这一般是你的java环境或者android环境没配全。虽然你打adb,java -version能看到版本信息,但其实还是没配置齐全的。详细的配置信息网上有很多教程,百度一下你就知道。 这里我解释下为什么需要安装这些环境。这是一张Appium的工作原理图,最左侧的是代码编写区域,也就是我们编写代码的客户端

Java多线程之synchronized详解

删除回忆录丶 提交于 2020-08-17 03:23:30
目录 synchronized简介 同步的原理 对象头与锁的实现 锁的优化与升级 Monitor Record 锁的对比 synchronized简介 synchronized 关键字,一般称之为“同步锁”或者重量级锁(JAVA SE 1.6之后引入了 偏向锁 和 轻量级锁 )。它具有可重入性. 根据锁的锁的“对象”不同可以分为对象锁和类锁: 对象锁: 对于普通的同步方法,锁的是当前实例的对象 对于同步方法块,如果 synchronized 括号里配置的是类的实例对象,则锁的是配置的对象 类锁: Class 对象锁 对于静态同步方法,锁的是当前类(具体说是当前类的Class对象) 对于同步方法块,如果 synchronized 括号里配置的是类的 Class 对象,则锁的是当前类 类锁其实也锁的是一个对象,不过是特殊的 Class 对象,所以类锁并不是真实存在的。但是他们之间有不同的目的 对象锁用来控制实例方法之间的同步 类锁是用来控制静态方法(或者静态变量互斥体)之间的同步的。 同步的原理 JVM 基于进入和退出 Monitor 对象来实现方法的同步和代码块同步。每个对象都有一个 Monitor 与之关联,当其被占用就会处于锁定的状态。 Monitor 并不是一个对象,只是习惯了这样一个称呼,他被保存在对象头的 Mark Word 中。 在Java虚拟机(HotSpot)中

恕我直言你可能真的不会java第8篇-函数式接口

你离开我真会死。 提交于 2020-08-17 03:22:37
一、函数式接口是什么? 所谓的函数式接口,实际上就是接口里面 只能有一个抽象方法的接口 。我们上一节用到的Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare。 只有一个抽象方法?那上图中的equals方法不是也没有函数体么?不急,和我一起往下看! 二、函数式接口的特点 接口有且仅有一个抽象方法,如上图的抽象方法compare 允许定义静态非抽象方法 允许定义默认defalut非抽象方法(default方法也是java8才有的,见下文) 允许java.lang.Object中的public方法,如上图的方法equals。 FunctionInterface注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错 甚至可以说:函数式接口是专门为lambda表达式准备的, lambda表达式是只实现接口中唯一的抽象方法的匿名实现类 。 三、default关键字 顺便讲一下default关键字,在java8之前 接口是不能有方法的实现,所有方法全都是抽象方法 实现接口就必须实现接口里面的所有方法 这就导致一个问题: 当一个接口有很多的实现类的时候,修改这个接口就变成了一个非常麻烦的事

那些年大厂流露出的数百道 Java 经典面试题.可查缺补漏

旧城冷巷雨未停 提交于 2020-08-17 03:07:07
Java 多线程面试题 1、多线程有什么用? 2、创建线程的方式 3、start()方法和run()方法的区别 4、Runnable接口和Callable接口的区别 5、CyclicBarrier和CountDownLatch的区别 6、volatile关键字的作用 7、什么是线程安全 8、Java中如何获取到线程dump文件 9、一个线程如果出现了运行时异常会怎么样 10、如何在两个线程之间共享数据 11、sleep方法和wait方法有什么区别 12、生产者消费者模型的作用是什么 13、ThreadLocal有什么用 14、为什么wait()方法和notify()/notifyAll()方法要在同步块中被调用 15、wait()方法和notify()/notifyAll()方法在放弃对象监视器时有什么区别 16、为什么要使用线程池 17、怎么检测一个线程是否持有对象监视器 18、synchronized和ReentrantLock的区别 19、ConcurrentHashMap的并发度是什么 20、ReadWriteLock是什么 21、FutureTask是什么 22、Linux环境下如何查找哪个线程使用CPU最长 23、Java编程写一个会导致死锁的程序 24、怎么唤醒一个阻塞的线程 25、不可变对象对多线程有什么帮助 26、什么是多线程的上下文切换 27、如果你提交任务时

Java 开发者的编程噩梦,为什么你的代码总有 bug??

99封情书 提交于 2020-08-17 02:26:11
文章已经收录在 Github.com/niumoo/JavaNotes ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。 很多 Java 初学者在开始编程时会出现一些问题,这些问题并不是指某个特定领域的问题,也不是指对某个业务不熟悉而导致的问题,而是对基础知识不够熟悉导致的问题。而就是这些问题让我们编写了一些不够健壮的代码。 这篇文章会列举几种编程初学者常常出现的一些问题,我相信这些问题多多少少也曾困扰着现在或曾经的你。如果觉得文章不错,不妨点赞分享,让更多人跳过这些开发中的坑。 随处可见的 Null 值 我见过很多的代码会把 Null 值作为返回值,当你预期是一个字符串时,意外得到了一个 Null 值;当你预期得到一个 List 时,意外又得到了一个 Null 值,如果你不进行处理,那么你还会意外得到 NullPointerException . 就像下面这样。 // 情况1 String userTag = getUserTag ( ) ; if ( userTag . equals ( "admin" ) ) { // NullPointerException // ... } // 情况2 List < String > carList = getCarList ( ) ; for ( String car : carList ) { //

JAVA开源游戏框架 FXGL

霸气de小男生 提交于 2020-08-17 01:51:25
本文适合有 Java 基础知识的人群,跟着本文可学习和运行 Java 的游戏。 本文作者:HelloGitHub- 秦人 HelloGitHub 推出的 《讲解开源项目》 系列,今天给大家带来一款开源 Java 游戏框架项目—— FXGLGames 项目源码地址:https://github.com/AlmasB/FXGLGames 一、项目介绍 都说 Java 语言无处不能,可以做桌面程序,可以做后台开发,可以做手机应用,也可以做游戏开发。本篇我们就重点讲一下一款 Java 游戏框架 FXGL ,它无需安装或设置,开箱即用,只需本地安装 jdk8+ 即可。游戏可轻松打包为可执行的 *.jar 文件,一行命令即可运行。 二、运行项目 2.1 前提 安装 Jdk8 或者更高版本,全称 Java Development Kit,它是 Java 的库函数,是编译、运行 Java 程序的工具包。 安装 Maven3 环境,进行项目构建和项目依赖包管理。 安装开发工具,例如:Idea,Eclipse,Spring Tool Suite 等。 安装 Git 工具,使用 GitBash 工具进行下载,提交代码等操作。 2.2 下载项目 执行如下代码,将项目下载到本地。 cd D:\devEnv git clone https://github.com/AlmasB/FXGLGames.git 2

Mybatis日志(5)

泪湿孤枕 提交于 2020-08-17 01:16:36
日志工厂 如果数据库出现异常错误,排错的时候,日志便是最好的工具助手 SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING SLF4J LOG4J 【掌握】 LOG4J2 JDK_LOGGING COMMONS_LOGGING STDOUT_LOGGING 【掌握】 NO_LOGGING 在MyBatis中使用哪个日志实现,在设置中进行配置 标准日志的实现 例如:使用 STDOUT_LOGGING 首先在配置文件中配置日志 <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> 结果(日志打印): Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. PooledDataSource forcefully closed/removed all connections. PooledDataSource forcefully closed/removed all connections. PooledDataSource forcefully closed/removed all

Hadoop环境搭建

≡放荡痞女 提交于 2020-08-17 01:01:25
Hadoop环境搭建 在/opt目录下创建两个目录 software: 存储jar包 module: 存储解压jar后的程序 JDK下载地址 Hadoop下载地址 官网地址 # 创建目录 sudo mkdir /opt/software sudo mkdir /opt/module # 修改目录的所有者和所有组 sudo chown lzd:lzd /opt/software /opt/module # 上传jdk、Hadoop-方案一,下载本地拷贝上去 scp jdk-14.0.2_linux-x64_bin.tar.gz room@[ip]:/opt/software scp hadoop-2.10.0.tar.gz room@[ip]:/opt/software # 上传jdk-、Hadoop方案一,直接wget wget -P /opt/software https://download.oracle.com/otn-pub/java/jdk/14.0.2+12/205943a0976c4ed48cb16f1043c5c647/jdk-14.0.2_linux-x64_bin.tar.gz?AuthParam=1597588035_9d4b49461fbfa78a01c92e092c587d90 wget -P /opt/software https://mirrors

深入探究JVM之对象创建及分配策略

风流意气都作罢 提交于 2020-08-17 00:46:51
@ 目录 前言 正文 一、对象的创建方式 二、对象的创建过程 对象在哪里创建 分配内存 对象的内存布局 三、对象的访问定位 四、判断对象的存活 对象生死 回收方法区 引用 对象的自我拯救 五、对象的分配策略 优先在Eden区分配 大对象直接进入老年代 长期存活的对象进入老年代 动态对象年龄判定 空间分配担保 总结 前言 Java是面向对象的语言,所谓“万事万物皆对象”就是Java是基于对象来设计程序的,没有对象程序就无法运行(8大基本类型除外),那么对象是如何创建的?在内存中又是怎么分配的呢? 正文 一、对象的创建方式 在Java中我们有几种方式可以创建一个新的对象呢?总共有以下几种方式: new关键字 反射 clone 反序列化 Unsafe.allocateInstance 为了便于说明和理解,下文仅针对new出来的对象进行讨论。 二、对象的创建过程 Java中对象的创建过程就包含上图中的5个步骤,首先需要验证待创建对象的类是否已经被JVM记载,如果没有则会先进行类的加载,如果已经加载则会在堆中(不完全是堆,后文会讲到)分配内存;分配完内存后则是对对象的成员变量设置初始值(0或null),这样对象在堆中就创建好了。但是,这个对象是属于哪个类的还不知道,因为类信息存在于方法区,所以还需要设置对象的头部(当然头部中也不仅仅只有类型指针信息,稍后也会详细讲到),这样堆中才创建好了一个

centos7中tomcat启动,获取图片验证码报错:/usr/javva/jdk1.8.0_251/jre/lib/i386/libfontmanager.so: libgcc_s.so.1

邮差的信 提交于 2020-08-17 00:07:18
错误:/usr/javva/jdk1.8.0_251/jre/lib/i386/libfontmanager.so: libgcc_s.so.1: 无法打开共享对象文件: 没有那个文件或目录 原因:系统提供的libgcc_s.so.1是64位的,java使用的是32位的,需要安装32位的libgcc_s.so.1。 解决: sudo yum install libgcc.i686 --setopt=protected_multilib=false 来源: oschina 链接: https://my.oschina.net/u/3573749/blog/4385512