newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
eg:ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
线程池的知识 补充:
线程池的作用:
线程池作用就是限制系统中执行线程的数量。
根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排 队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池 中有等待的工作线程,就可以开始运行了;否则进入等待队列。
为什么要用线程池:
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。
单机模式、集群模式和伪集群模式。
链接:https://blog.csdn.net/u011489043/article/details/78881507
1. 尽量使用hash
2. 根据业务场景,考虑使用BITMAP
3. 其他
1)Redis提供内存回收策略,根据使用的情况可以选择适当的回收策略,比如过期数据清除,expire设置数据过期时间;
2)Redis提供内存共享策略,服务器启动时,会自动创建0-9999的数字对象,其他地方使用,可以直接引用。
1.不可分割
一个user的属性不可以在分割,比如说name,age
2.要有主键
一个表的其他属性要跟主键有关系,比如说一个人有主键的身份证,名字,年龄。
3.消除依赖
一张表不可以有太多关联字段信息,比如说教务系统中的 一个学生,除了有学生信息之外,还有学院信息(学院名,系主任等),而系主任又是属于另一张表。所以需要在学生表中添加一个字段来指向学院信息。
@SpringBootApplication:实现配置文件
@EnabledAutoConfiguration:打开自动配置
@ComponentaScan:spring组件扫描
链接:https://blog.csdn.net/lengxiao1993/article/details/82771768
为了实现可靠传输,发送方和接收方始终需要同步( SYNchronize )序号。 需要注意的是, 序号并不是从 0 开始的, 而是由发送方随机选择的初始序列号 ( Initial Sequence Number, ISN )开始 。 由于 TCP 是一个双向通信协议, 通信双方都有能力发送信息, 并接收响应。 因此, 通信双方都需要随机产生一个初始的序列号, 并且把这个起始值告诉对方。
前修知识:
1.TCP 是可靠通信协议, 而 UDP 是不可靠通信协议。
TCP 的可靠性含义: 接收方收到的数据是完整, 有序, 无差错的。
UDP 不可靠性含义: 接收方接收到的数据可能存在部分丢失, 顺序也不一定能保证。
2.UDP 和 TCP 协议都是基于同样的互联网基础设施, 且都基于 IP 协议实现, 互联网基础设施中对于数据包的发送过程是会发生丢包现象的, 为什么 TCP 就可以实现可靠传输, 而 UDP 不行?
TCP 协议为了实现可靠传输, 通信双方需要判断自己已经发送的数据包是否都被接收方收到, 如果没收到, 就需要重发。 为了实现这个需求, 很自然地就会引出序号(sequence number) 和 确认号(acknowledgement number) 的使用。
发送方在发送数据包(假设大小为 10 byte)时, 同时送上一个序号( 假设为 500),那么接收方收到这个数据包以后, 就可以回复一个确认号(510 = 500 + 10) 告诉发送方 “我已经收到了你的数据包, 你可以发送下一个数据包, 序号从 510 开始” 。
这样发送方就可以知道哪些数据被接收到,哪些数据没被接收到, 需要重发。
Redis和MongoDB都是属于非关系型数据库。但是两者还是有区别的:
MongoDB介于关系型和非关系型,一是存储在内存中,二是支持索引,游标,和类似sql的查询。所以在查询效率方面,MongoDB比较擅长,特别是在海量数据的查询。但是不支持事务。
1.内存管理:
redis的数据全部存在内存中,定期写入磁盘知识为了实现持久化。
MongoDB的数据实际上是存在硬盘中的,将要操作的数据通过映射到内存的某个区域,然后在只这快区域内进行数据修改。
2.数据结构:
redis支持五种数据,比较丰富。(string,hash,list,set,sortedset)
MongoDB数据结构单一,但是支持丰富的数据表达(JSON),还支持索引。
一、工作原理:
1.读取核心配置文件并返回InputStream对象
2.根据InputStream对象解析出Configuration对象,创建出SqlSessionFactory对象
3.从工厂中创建SqlSession对象
4.从SqlSession中调用Executor独享执行数据库操作,生成sql语句
5.对sql执行结果二次封装
6.提交事务
二、执行流程
1.读取核心配置文件,mybatis(配置:数据源、事务和映射文件)和map映射文件(Dao类对应的映射文件)
1.1. mybatis(配置:数据源、事务和映射文件)
1.2. XxxMapper.xml(map映射文件(Dao类对应的映射文件))
1.3. 从main方法入口(Resources.getXXX)
2.根据配置文件生成SqlSessionFactory对象
2.1 加载资源文件(配置文件),返回一个InputStream对象。
2.2 builder方法生成SqlSession的工厂类对象
3.创建SqlSession对象(包含执行sql的命令的方法)
4.调用Executor执行数据库操作,生成sql语句和statement对象。
5.对执行结果进行返回(二次封装)
5.提交事务
//饿汉式(立即加载)
public class Singleton1 {
// 指向自己实例的私有静态引用,主动创建
private static Singleton1 singleton1 = new Singleton1();
// 私有的构造方法
private Singleton1(){}
// 以自己实例为返回值的静态的公有方法,静态工厂方法
public static Singleton1 getSingleton1(){
return singleton1;
}
}
//懒汉式(延迟加载)
public class Singleton2 {
// 指向自己实例的私有静态引用
private static Singleton2 singleton2;
// 私有的构造方法
private Singleton2(){}
// 以自己实例为返回值的静态的公有方法,静态工厂方法
public static Singleton2 getSingleton2(){
// 被动创建,在真正需要使用时才去创建
if (singleton2 == null) {
singleton2 = new Singleton2();
}
return singleton2;
}
}
递归打印文件和目录(包括子文件夹)
import java.io.File;
import java.io.IOException;
public class InputStreamTest {
public static void main(String[] args) throws IOException {
File file=new File("d:/360Downloads");//指定要打印的盘符文件
showAllFile(file);
}
/**
* 递归打印指定文件夹下所有文件
* @param file
*/
private static void showAllFile(File f) {
// TODO Auto-generated method stub
System.out.println(f);//打印目录
File[] fsFiles=f.listFiles();//获得所有的子文件
for (File file : fsFiles) {
if(file.isDirectory()) {//判断子目录是否是目录
showAllFile(file);//递归打印
}
System.out.println(file);//子文件直接输出
}
}
}
冒泡排序
public class ArrayBubbleSort {
public static void main(String[] args) {
int[] arr = { 74, 86, 15, 35, 2 };
for (int i = 1; i < arr.length; i++) { // 也可以写成 (i=0;i
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int temp : arr) {
System.out.println("temp = " + temp);
}
}
}
都是自己遇到不太清楚的,记录学习一下。后面将持续更新。