创建线程池的三种方式:
- public static ExecutorService newSingleThreadExecutor()
- public static ExecutorService newFixedTheadPool()
- public static ExecutorService newCachedThreadPool()
- newSingleThreadExecutor返回一个包含单线程的Executor,这个线程处理完一个任务后再处理下一个任务,如果这个线程出现异常,则重新创建一个线程来代替这个线程
- newFixedTheadPool返回一个包含指定数目线程的线程池,若任务数多于线程数则新创建的线程必须等待知道有任务完成
- newCachedThreadPool根据用户的任务数来创建相应的线程数来处理,完全依赖于JVM能创建的线程的数量,可能会导致内存不足。
常用的linux命令
- ps -ef|grep :查看进程
- kill somePid :杀掉进程
- netstat -npl:查看端口
- cp from to:拷贝命令
- du:查看磁盘使用情况
- free:查看内存使用情况
- top:查看系统资源使用情况
- service -status -al:查看已有服务
- 如何查找linux文件中的关键字:1.在文件已经通过vim打开的情况下,在vim下输入'/'+关键字 2.在文件没有打开的情况下,用"cat 文件名|grep 关键字"
java中常见的抽象类:
- StringBuilder(线程安全),StringBuffer(线程不安全)都继承自AbstractStringBuilder类
- 线程池中有一个AbstractExecutorService抽象类
抽象类与接口如何选择
如果要创建不带成员变量和方法定义的基类就选择接口,反之要创建带有成员变量和方法定义的基类就选择抽象类。
java中常见的Exception:
- java.lang.NullPointerException
- java.lang.ClassNotFoundException
- java.lang.ArrayIndexOutOfBoundsException
- java.lang.IllegalArgumentException
Restful
restful是一种http架构风格而不是具体的协议,它主要有四个特点:
- 通过URL来对资源进行指定的操作
- 对资源的操作包括获取,创建,修改和删除正好对应HTTP协议的GET,POST,PUT和DELETE方法
- 连接是无状态的(无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态)
HDFS文件存储原理
看这篇文章:HDFS文件存储
如何保证HDFS中副本数据的一致性
HDFS会对写入的所有数据计算校验和(checksum),并在读取数据时验证校验和。
DataNode在保存数据前负责验证checksum,client会把数据和checksum一起发送到一个由多个datanode组成的队列中,最后一个Datanode负责验证checksum。如果验证失败会抛出一个异常。
客户端从DataNode读取数据时也会验证checksum。每个Datanode都保存了一个验证checksum的日志,每次客户端成功验证一个数据块后都会告知DataNode,DataNode会更新日志。每个DataNode也会在后台运行一个DataBlockScanner来定期验证这个datanode上的所有的数据块。
抽象类和接口的区别
- 抽象类只能单继承,接口可以多实现
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的
- 抽象类中可以有构造器,接口中不能有构造器
- 抽象类中可以没有抽象方法,接口中的方法一定是抽象方法
抽象类中可以没有抽象方法吗?
可以没有抽象方法,但是这个类已经被声明为一个抽象类,就不能再实例化
为什么四次挥手的第二,三次挥手不能合到一起(为什么不能是三次挥手)
因为此时A虽然不发送数据了,但是还可以接收数据,B可能还有数据要发给A,所以两次挥手不能合为一次