Java篇——IO流,线程和多线程

不惊扰别人的宁静,就是慈悲;

不伤害别人的自尊,就是善良;

人活着发自己的光就好,不要吹灭别人的灯。

IO流

字节流和字符流

字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是 音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.

所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列.

字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

复制文件

随机中文流

线程

进程和线程

进程

扫描二维码关注公众号,回复: 2410992 查看本文章

程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理器上的一次执行过程,它是一个动态的概念。

进程是一个具有一定独立功能的程序,一个实体,每一个进程都有它自己的地址空间。

线程

线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干程序又可以划分成若干个线程。

线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个线程(单线程程序)

一个程序可以同时执行多个任务,来提供效率。

例如:

1)同时下载多个电影

2)同时与多人聊天

并行:就是两个任务同时运行(多个CPU)

并发:是指两个任务同时请求运行,而处理器次只能接受一个任务,就会把两个任务安排轮流执行,由于cpu时间片运行时间较短,就会感觉两个任务在同时执行。

线程的状态

线程具有以下四种基本状态。

1)就绪状态(Ready):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,只等待获取cpu的使用权

2)运行状态(Running):就绪状态的线程获取了cpu执行程序代码

3)阻塞状态(Blocked):是因为某种放弃cpu使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞分为三种:

1)等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入等待池中。进入这个状态后,不能自动唤醒,必须依靠其他线程调用notify()notifyAll()方法才能被唤醒

2)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

3)其他阻塞:运行的线程执行sleep()金额join()方法,或者发出了I/O请求时,JVM会把该线程设置为阻塞状态,当sleep()状态超时,或者join()等待线程终止或者超时,或者I/O处理完毕时,线程重新转入就绪状态。

4)死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期

线程同步

1.多线程共享数据

在多线程的操作中,多个线程有可能同时处理同一个资源,这就是多线程中的共享数据。

2.线程同步

解决数据共享问题,必须使用同步,所谓同步就是指多个线程在同一个时间段内只能有一个线程执行指定代码,其他线程要等待此线程完成之后才可以继续执行。

线程进行同步,有以下三种方法:

(1)同步代码块

synchronized(要同步的对象){

  要同步的操作;

}

(2)同步方法

public synchronized void method(){

  要同步的操作;

}

(3) Lock(ReentrantLock)

synchronizedLock的区别

1)Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个接口,通过这个类可以实现同步访问;

2)Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。

举例:

当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突现象,但是读操作和读操作不会发生冲突现象。

但是采用synchronized关键字来实现同步的话,就会导致一个问题:

如果多个线程都只是进行读操作,所以当一个线程在进行读操作时,其他线程只能等待无法进行读操作。

因此就需要一种机制来使得多个线程都只是进行读操作时,线程之间不会发生冲突,通过Lock就可以办到。

另外,通过Lock可以知道线程有没有成功获取到锁。这个是synchronized无法办到的。

猜你喜欢

转载自blog.csdn.net/hanjiangdudiao11/article/details/81209842