1 | sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin |
查询版本
ls /Library/Java/JavaVirtualMachines/
删除
sudo rm -rf /Library/Java/JavaVirtualMachines/${jdk_version}
brew install redis
出现以下效果就是安装成功了
1 | ==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/bottles/redis-6.0.1 |
启动redis
1 | //方式一:使用brew帮助我们启动软件 |
停止redisbrew services stop redis
1、创建Thread 对象,并且实现run方法 最后 thread.start()。
2、实现runnable 接口 Thread runnable 作为Thread 的构造参数。
3、通过Callable和Future接口创建线程。
前面两种都很简单,这里说一下通过Callable 和 Future 接口创建线程的代码:
通过这两个接口创建线程,你要知道这两个接口的作用,下面我们就来了解这两个接口:
通过实现Runnable接口创建多线程时,Thread类的作用就是把run()方法包装成线程的执行体,
那么,是否可以直接把任意方法都包装成线程的执行体呢?从JAVA5开始,JAVA提供提供了Callable接口,
该接口是Runnable接口的增强版,Callable接口提供了一个call()方法可以作为线程执行体,
但call()方法比run()方法功能更强大,call()方法的功能的强大体现在:
1、call()方法可以有返回值;
2、call()方法可以声明抛出异常;
从这里可以看出,完全可以提供一个Callable对象作为Thread的target,
而该线程的线程执行体就是call()方法。但问题是:Callable接口是JAVA新增的接口,
而且它不是Runnable接口的子接口,所以Callable对象不能直接作为Thread的target。
还有一个原因就是:call()方法有返回值,call()方法不是直接调用,而是作为线程执行体被调用的,
所以这里涉及获取call()方法返回值的问题。
于是,JAVA5提供了Future接口来代表Callable接口里call()方法的返回值,
并为Future接口提供了一个FutureTask实现类,该类实现了Future接口,
并实现了Runnable接口,所以FutureTask可以作为Thread类的target,
同时也解决了Callable对象不能作为Thread类的target这一问题。
在Future接口里定义了如下几个公共方法来控制与它关联的Callable任务:
1、boolean cancel(boolean mayInterruptIfRunning):试图取消Future里关联的Callable任务;
2、V get():返回Callable任务里call()方法的返回值,调用该方法将导致程序阻塞,必须等到子线程结束以后才会得到返回值;
3、V get(long timeout, TimeUnit unit):返回Callable任务里call()方法的返回值。该方法让程序最多阻塞timeout和unit指定的时间,如果经过指定时间后,Callable任务依然没有返回值,将会抛出TimeoutException异常;
4、boolean isCancelled():如果Callable任务正常完成前被取消,则返回true;
5、boolean isDone():如果Callable任务已经完成, 则返回true;
这种方式创建并启动多线程的步骤如下:
1、创建Callable接口实现类,并实现call()方法,该方法将作为线程执行体,且该方法有返回值,再创建Callable实现类的实例;
2、使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值;
3、使用FutureTask对象作为Thread对象的target创建并启动新线程;
4、调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。
1 | public static void main(String[] args) { |
jvm 垃圾回收主要是针对jvm内存模型的jvm堆。通俗来讲,jvm垃圾回收主要就是针对堆内存的分配与回收。
jvm 堆是垃圾回收的主要区域,也叫做GC堆(garbage collected heap),从垃圾回收的角度,
由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆还可以细分为:
新生代和老年代:再细致一点有:Eden 空间、From Survivor、To Survivor 空间等。
进一步划分的目的是更好地回收内存,或者更快地分配内存。
上图所示的 Eden 区、From Survivor0(“From”) 区、To Survivor1(“To”) 区都属于新生代,Old Memory 区属于老年代。
大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,
则会进入 s0 或者 s1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),
当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,
可以通过参数 -XX:MaxTenuringThreshold 来设置。
Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。
所以,所谓原子类说简单点就是具有原子/原子操作特征的类。
java.util.concurrent 的原子类都存放在java.util.concurrent.atomic下,如下图所示。
1、基本原子类介绍
AtomicInteger:整型原子类
AtomicLong:长整型原子类
AtomicBoolean :布尔型原子类
上面的类几乎是一样的,所以这里就使用AtomicInteger进行举例
提供的常用api方法:
1 | public final int get() //获取当前的值 |
AtomicInteger 常见方法使用
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int temvalue = 0;
AtomicInteger i = new AtomicInteger(0);
temvalue = i.getAndSet(3);
System.out.println("temvalue:" + temvalue + "; i:" + i);//temvalue:0; i:3
temvalue = i.getAndIncrement();
System.out.println("temvalue:" + temvalue + "; i:" + i);//temvalue:3; i:4
temvalue = i.getAndAdd(5);
System.out.println("temvalue:" + temvalue + "; i:" + i);//temvalue:4; i:9
}
}
1 在某次seo中,发现google spider 爬取页面是500,这让我陷入到深深的沉思当中,为什么会产生这样的问题呢,我对google保持了怀疑!
2 于是在怀疑当中,我查看了google 5xx文档,发现可能是页面参数问题???(并不是!)
3 突然想到nginx具有查看日志的功能,然后 grep 了access日志,发现竟然是服务器返回的500!!!
4 但是此时我并不知道如何解决这个问题(应用程序不是我写的!世界上最美丽的语言我看不懂!)
5 于是我想到了,那可不可以用nginx来生成访问日志呢,带着这个疑问我打开了百度! 唉!还真行!
1 翻阅了一下资料后,我确定了一个方案,利用 lua-nginx-module 进行响应日志生成
2 日志有了,那如何不停机实现响应记录呢?因为之前已经有一台ng了,要是重新 add lua-nginx-module 岂不是要进行停机?
3 于是我有了第二套方案, 我新装一个ng,然后检测我想要的端口 代理转发过去不久行了嘛?
4 说干就干!
1 安装Anaconda3 参考 linux 下安装Anaconda3
2 因为我们要编译 dlib,所以我们需要pip命令,这里仔细检查pip是否能正常使用
dlib tar.gz下载
或者使用命令: wget https://files.pythonhosted.org/packages/05/57/e8a8caa3c89a27f80bc78da39c423e2553f482a3705adc619176a3a24b36/dlib-19.17.0.tar.gz
3 执行命令 pip install dlib-19.17.0.tar.gz 即可完成编译。
这里提供下载地址,可以根据需求来https://www.anaconda.com/products/individual
我这里就直接选择了一个wget https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh
sh Anaconda3-2020.11-Linux-x86_64.sh
就可以了
一路yes yes就行了
安装过程中如果出现:yum install -y bzip2
如果正常安装完成,那么控制台输入 conda
查看有无反应,如果提示
yum update
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker:sudo yum install docker-ce docker-ce-cli containerd.io
启动docker:sudo systemctl start docker
停止docker:systemctl stop docker
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true