一、线程
-
CPU内核数:CPU独立运行计算的核心数量,例如 intel i5-10400有6个 内核,经因特尔的超线程技术,可以实现12个线程,具体可查看设备管理器CPU设备的数量
-
线程:操作系统运行的程序代码,多个线程可以并行运行,是操作系统CPU执行命令的具体操作
-
进程:操作系统分配的一片内存资源,一个应用程序就被分配一个进程,然后CPU根据线程来对内存资源和各种外设进行操作。一个进程可以有多个线程,但是它们并不是包含关系,而是不同的东西。
-
Java实现多线程:
- 继承Thread:构造一个线程类,继承Thread,并重写run方法。通过该 线程类的对象的start(开启线程)或run(单纯调用方法)方法来执行线程。
- 实现Runnable:构造线程类实现Runnable,并重写run方法。把该对象放入Thread对象构造器来创建线程对象,并.start开启线程。
- 实现Callable:实现Callable并重写run方法。把该对象传入FutureTask对象,再把FutureTask对象传入Thread,.start开启线程。值得注意的是,Callable提供了返回值,构造Callable时必须给一个泛型,即为返回值的类型。
- 线程池:略
-
start与run的区别:start的开启线程,在另一个线程里面执行线程里的run方法,而run只是在当前线程执行一个对象里面的方法而已。
-
CyclicBarrier 和CountDownLatch的区别:两者都是线程计数器,拥有让线程组中的线程等待其它线程执行完才继续执行的效果,但是CyclicBarrier可以重复使用,而CountDownLatch是一次性的。
-
sleep与wait的区别:sleep是占着线程睡觉,就像单片机程序里的延时函数,卡在那里延时;而wait是让线程进入等待状态,直到被其它线程唤醒,上面的CyclicBarrier和CountDownLatch就是计数到了就唤醒wait的线程。
-
CPU高速缓存:CPU本身有缓存区,某些变量会被缓存入该区域内,使用的时候会直接读取,而不会读取变量在内存中的值,这在多线程的使用下,可能导致A线程写变量x为值newValue,而B线程读取变量x的值却为oldValue的情况。
-
volatile:该关键字用于修饰类成员,保证其读取内存中的值并且不缓存它,确保了线程读取到的变量值与内存中一致。
-
如何确保线程按想要的顺序执行:使用join,例如有个线程thread1,在主线程main里面,如果使用thread1.join(),则主线程就卡死在这里,直到thread1执行完死了。
-
yield():暂停某线程,thread1.yield(),让其放弃CPU使用权,但是也可能它放弃了又马上获得了使用权。
二、IO
- File:文件类,定义文件对象,包含方法:
- exist:检查文件是否存在
- isDerectory:检查是否是目录
- mkdir:创建文件夹
- createNewFile:创建新文件
…
- FileInputStream:有参构造,参数为File。从文件读取数据,字节流,即对byte类型的数据进行操作(unicode)
- FileOutputStream:参数为File。写数据进文件,字节流
- FileWritter:参数为File,构造完以后给BufferedWritter使用。
- FileReader:参数为File,构造完以后给BufferedReader使用。
- ObjectInputStream:以FileInputStream为参数构造,进行对象的输入,反序列化
- ObjectOutputStream:以FileInputStream为参数构造,对象的输出,序列化。序列化操作输出的东西人类是看不懂的,只有计算机看得懂。就是一个数据持久化的操作。
- BufferedWritter:以FileWritter为参数。字符流,可以直接写String类型的字符串进文件里。
- BufferedReader:以FileReader为参数。字符流,读取中文时不会像FileOutputStream那样乱码
- IO流可按照三种方式进行分类
- 按方向:输出流、输入流
- 按传输大小:字符流、字节流
- 按功能:节点流、处理流
- File是一个文件类,节点流的使用需要传入File类对象;而处理流的使用又需要传入节点流对象;就是一层套一层的。所以说FileWritter为节点流、BufferedWritter为处理流,它也叫处理流中的缓冲流。