Java 线程池关闭

1
2
3
4
5
6
7
8
9
10
11
12
13
public void close() {
if (scheduledExecutorService != null) {
scheduledExecutorService.shutdown();
try {
if (!scheduledExecutorService.awaitTermination(10, TimeUnit.SECONDS)) {
scheduledExecutorService.shutdownNow();
}
} catch (InterruptedException e) {
scheduledExecutorService.shutdownNow();
}
scheduledExecutorService = null;
}
}

【Java并发】java线程池

1. Executor

  • Executor是线程池的顶级接口,只有一个方法execute()
  • ExecutorService是Executor的子接口,提供了线程池生命周期管理的方法,一个可跟踪一个或多个异步任务执行情况返回Future的方法。
方法 功能描述
execute() 执行任务
shutdown() 调用后不再接收新任务,如果里面有任务,就执行完
shutdownNow() 调用后不再接收新任务,取消等待中的任务,返回等待执行的任务的list;有正在执行的任务,会尝试停止
isShutdown() 判断线程池是否完全停止
isTerminated() 判断线程池有任务在执行
submit() 提交带返回值的任务,返回值封装到Future中,通过Future.get()可以获取返回值
invokeAll() 执行一组任务

2. ThreadPoolExecutor

2.1 构造方法

1
2
3
4
5
6
7
8
9
public ThreadPoolExecutor(
int corePoolSize, //核心线程数
int maximumPoolSize, //最大线程数
long keepAliveTime, //保持存活时间
TimeUnit unit, //时间单位
BlockingQueue<Runnable> workQueue, //阻塞队列
ThreadFactory threadFactory, //线程工厂
RejectedExecutionHandler handler //异常捕获器
)

2.2 TimeUnit unit

参数keepAliveTime的时间单位,有7种取值

  • TimeUnit.DAYS //天
  • TimeUnit.HOURS //小时
  • TimeUnit.MINUTES //分钟
  • TimeUnit.SECONDS //秒
  • TimeUnit.MILLISECONDS //毫秒
  • TimeUnit.MICROSECONDS //微妙
  • TimeUnit.NANOSECONDS //纳秒

    2.3 keepAliveTime

    当线程空闲时,所允许保存的最大时间,超过这个时间,线程将被释放销毁,但只针对于非核心线程。

    3. 阻塞队列

    3.1 BlockingQueue

    |阻塞队列 | 功能描述 |
    |—|—|
    |BlockingQueue | 阻塞队列的顶级接口,主要用于实现生产者消费者队列 |
    |BlockingDeque | 双端队列 |
    |SynchronousQueue | 同步队列,无界队列,直接提交策略,交替队列,在某次添加元素后必须等待其他线程取走后才能继续添加 |
    |LinkedBlockingQueue | 无界队列,基于链表的阻塞队列,可以并发运行,FIFO |
    |ArrayBlockingQueue | 基于数组的有界(固定大小的数组)阻塞队列,只有put方法和take方法才具有阻塞功能,公平性 fairness |
    |PriorityBlockingQueue | 基于优先级的阻塞队列,依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序 |
    |DelayQueue | 延时队列|

    4. 线程池工具类Executors

    |方法 |功能描述|
    |—|—|
    |newCachedThreadPool() |创建一个可缓存的线程池|
    |newFixedThreadPool() |创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待|
    |newScheduledThreadPool()| 创建一个定长线程池,支持定时及周期性任务执行。|
    |newSingleThreadExecutor()| 创建单线程化线程池,始终保证线程池中会有一个线程在。当某线程死去,会找继任者|
    |defaultThreadFactory() |创建一个默认线程池工厂|

Java创建Listener

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Listener implements Runnable{
private ScheduledExecutorService scheduledExecutorService;
private static final int DEFAULT_INTERVAL = 100000;

public Listener() {
int interval = DEFAULT_INTERVAL;
this.scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleWithFixedDelay(this, 0, interval, TimeUnit.MILLISECONDS);
}

@Override
public void run() {
Thread.currentThread().setName("XXXListener");
System.out.println("exec check data.");
}
public void close() {
if (scheduledExecutorService != null) {
scheduledExecutorService.shutdown();
try {
if (!scheduledExecutorService.awaitTermination(10, TimeUnit.SECONDS)) {
scheduledExecutorService.shutdownNow();
}
} catch (InterruptedException e) {
scheduledExecutorService.shutdownNow();
}
scheduledExecutorService = null;
}
}
}

Git使用中遇到的问题

Git 放弃本地更改,拉取远端最新代码

1
2
3
git fetch --all
git reset --hard origin/master
git pull

Git commit信息写错了,更改commit信息

1
2
git commit --amend
//执行此命令后,进入Vi编辑模式,第一句为Commit信息,更改保存退出即可

React总结

React特点:

  • 虚拟dom

    • 简单的UI开发逻辑
    • 组件化
      • 一个组件应该具有的特征:
    • 可组合
    • 可重用
    • 可维护

      Jsx语法:在html中直接写Js代码,不加任何引号,允许html和js混写

  • 组件的生命周期:

    • Mounting:已插入真实 DOM
    • Updating:正在被重新渲染
    • Unmounting:已移出真实 DOM

    和组件生命周期相关的几个方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    getDefaultProps //创建组建
    getInitialState //实例化状态
    componentWillMount //挂载前
    componentDidMount //挂载后
    componentWillReceiveProps //属性被改变时
    shouldComponentUpdate //是否更新
    componentWillUpdate //更新前
    componentDidUpdate //更新后
    componentWillUnmount //销毁前
  • 1、ReactJs是基于组件化的开发,所以最终的页面应该是由若干个小组件组成的大组件。

  • 2、可以通过属性,将值传递到组件内部,同理也可以通过属性将内部的结果传递到父级组件(留给大家研究);要对某些值的变化做DOM操作的,要把这些值放到state中。
  • 3、为组件添加外部css样式时,类名应该写成className而不是class;
    forhtmlFor,添加内部样式时,应该是style={{opacity: this.state.opacity}}
    而不是style="opacity:{this.state.opacity};"
  • 4、组件名称首字母必须大写。
  • 5、变量名用{}包裹,且不能加双引号。

    ReactJS优缺点:

  • 优点:
    • React速度很快
    • 浏览器兼容 兼容到IE8
    • 模块化(1、 模块化组件 2、 对于每个组件方便独立进行开发和测试,提高了代码可维护性)
    • 单向数据流
  • 缺点:

    • React只是MVC中V,并不是一个完整的框架

      React创建组件:

  • 1.创建组件两种方式:

    • 无状态组件
    • 类组件(ES6的class)
  • 2.原则:遵守单一职责的原则
  • 3.一个类组件包含:
    • 属性:props
    • 内部状态
    • 处理逻辑
    • 事件处理
    • 渲染:render
    • 生命周期函数
  • 4.组件创建技巧
    • 尽可能无状态化
    • 减少冗余
    • 创建多个只负责渲染数据的无状态组件,在他们的上层创建一个有状态的组件并把状态通过props传递给子级
    • 有状态组件封装了所有用户的交互逻辑,无状态组件只负责声明式渲染

Redis和Memcache

  • Redis和Memcahe的对比
    • Redis不仅支持键值对的存储,还支持list,set,hash,zset(有序集合)数据结构的存储
      +

kafka

  • kafka是一个分布式消息队列。具有高性能、持久化、多副本备份、横向拓展能力。
  • kafka对外使用topic的概念,生产者往topic里写消息,消费者从topic中读消息。一个topic实际是由多个partition组成的,遇到瓶颈时,
    可以通过增加partition的数量来进行横向扩容。单个parition内是保证消息有序。

  • **Kafka ActiveMQ RabbitMQ对比

1、 TPS

  • Kafka最高,RabbitMq次之,ActiveMq最差

2、 吞吐量对比
kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)复杂度,消息处理的效率很高。

Zero-Copy技术

1
2
3
4
5
6
7
8
9
10
通常情况下文件从读取到通过Socket发送进行了4次拷贝:
1、调用read时,文件A拷贝到了kernel模式;
2、CPU控制将kernel模式数据copy到user模式下;
3、调用write时,先将user模式下的内容copy到kernel模式下的socket的buffer中;
4、将kernel模式下的socket buffer的数据copy到网卡设备中传送;

Zero-Copy技术省去了将操作系统的read buffer拷贝到程序的buffer,以及从程序buffer拷贝到socket buffer的步骤,
1、将文件拷贝到kernel buffer中;
2、向socket buffer中追加当前要发生的数据在kernel buffer中的位置和偏移量;
3、根据socket buffer中的位置和偏移量直接将kernel buffer的数据copy到网卡设备(protocol engine)中;

3、在架构模型方面
RabbitMQ实现了AMQP协议(advanced message queue protocol高级消息队列协议)
RabbitMQ有消息确认机制;
Kafka遵从一般的MQ结构,无消息确认机制。
4、在可用性方面
RabbitMQ支持miror的queue,主queue失效,miror queue接管。
Kafka的broker支持主备模式
ActiveMq也支持主备模式

  • Kafka的优缺点
  • 优点:
    • 主要用来解决百万级别的数据中生产者和消费者之间数据传输
    • 可以将一条数据提供给多个接受短做不同的处理
    • 两个系统间的通讯
    • 做为日志的收集的一环
    • kafka吞吐量高,单机吞吐量kafka达十万级,而ActiveMQ,RabbitMQ,RocketMQ的吞吐量为万级。
    • 分布式容灾好
    • 数据量不会影响到KafKa的速度
  • 缺点:
    • 不支持事务
    • 重复消息。Kafka保证每条消息至少送达一次,虽然几率很小,但一条消息可能被送达多次
    • 消息乱序。Kafka某一个固定的Partition内部的消息是保证有序的,如果一个Topic有多个Partition,partition之间的消息送达不保证有序。
    • 复杂性。Kafka需要Zookeeper的支持,Topic一般需要人工创建,部署和维护比一般MQ成本更高

Linux常用命令

  • 查看使用内存最多的10个进程

  • ps -aux | sort -k4nr | head -n 10

  • top (然后按下M,注意大写)

  • 查看使用CPU最多的10个进程

  • ps -aux | sort -k3nr | head -n 10

  • top (然后按下P,注意大写)

    ps命令参数解释

    1
    2
    3
    -a : 显示现行终端机下的所有进程,包括其他用户的进程;
    -u : 以用户为主的进程状态 ;
    x : 通常与 a 这个参数一起使用,可列出较完整信息。

    查看网卡流量

    • watch more /proc/net/dev 可以查看每2秒的字节和数据包的变化