进程和线程,IO流,File相关知识点的整理
第十七天进程和线程--------
1.进程:
就是正在运行的程序,分配内存让应用程序能够运行。
Windows系统号称:多任务(可以同时运行多个应用程序)。
宏观上看:Windows确实是允许多个程序运行
微观:cpu快速的切换执行任务。
2.线程:
线程在一个进程中负责代码的执行,就是一个进程中的执行路径。
注意:
java程序在运行的时候,jvm会帮我们创建一个主线程来执行代码。主线程主要负责main方法中的代码执行。
一个java程序中至少有两条:
主线程;垃圾回收线程。
多线程:
在一个进程中,有多个线程同时执行不同的任务。
“同时”:单核cpu快速的切换多个线程执行。切换速度特别快。
好处:
1.一个进程中,解决一个线程中同时执行多个任务的问题。
2.提高资源的利用率
弊端:
1.增加cpu的负担。不是线程越多越好。
2.降低了一个进程中的执行概率。
3.容易引发线程安全问题。
4.容易出现死锁
Java中线程的创建方式:
线程的创建方式一:
1.定义一个类来继承Thread。
2.重写thread类中的run方法,把自定义线程的任务代码写在run方法中。
每一个线程都有都有自己的任务代码,jvm在创建的主线程的任务代码就是main方法。自定义的线程的任务就写在run方法中
3.创建Thread的子类,并且调用start方法开启线程。
线程的创建方式二:
1.自定义一个类实现接口Runnable,接口中就会提供一个run方法。
2.实现Runnable方法中的run方法。
3.创建Runnable接口的实现类对象
4.创建一个Thread对象,并把Runable实现类创建对象作为参数
5.调用Thread对象的start来开启线程
问题:为啥要将Runable接口实现类的做线作为参数传递
注意点:
一旦线程开启了,会默认执行对象中的run方法,但是千万不要自己直接调用run方法,这样调用就和调用普通方法一样 了。
线程中常用的方法:
Tread(String name);初始化线程的名字
getname();返回线程的名字
setName(String name);设置线程对象的名字
Sleep();线程的堵塞状态(睡眠时间是毫秒)
getpriority(); 设置线程的优先级(默认是5)
currentThread();获取主线程
注意:
Run方法中的睡眠,是谁在执行,就睡眠谁。
Java给线程枷锁
方式一:同步代码块
Synchronized(锁对象){
}
在java中任意一个对象 都都会有一个对象状态,就可以通过对象的状态来作为锁i的一个标示符。
Statue = 0,表示锁是关闭的,= 1表示开启
同步代码块的使用的注意点:
1.任意对象都可以做锁的对象
2.如果你在同步代码块中调用了seelp方法,是不会释放锁对象的。
3.只有在真正存在线程安全的时候才需要使用同步代码块,否则会降低执行效率
4.多线程操作对象必须是唯一的,否则无效
出现线程安全的问题根本原因:
1.存在两个或两个以上的线程。并且线程之间共享着同一个资源。
2.多个语句操作了共享资源。
方式二:同步函数
同步函数是否有锁对象:有的
同步函数的使用注意点:
1.如果是非静态的函数,同步函数的锁就是调用方法的对象(但对象要唯一,如果不唯一,没有效果)
2.如果是一个静态函数,同步函数的锁对象是:当前函数所属类的字节文件(class对象)
3.同步函数的锁对象固定,不能够
自己指定。
推荐使用:同步代码快
原因:
1.同步代码块的对象可以由我们任意指定,同步函数是固定的。
2.同步代码快可以控制同步范围,同步函数必须是整个函数的所有代码都被同步
代码同步是可以解决线程安全问题
但是使用不当,会造成线程死锁问题。。。
A线程在等B线程完成,B线程在等A线程完成,一直在等,造成线程死锁。
线程死锁不一定会造成线程死锁,可能会出出现。
死锁现象的解决方案,没有,尽量避免。
线程的通讯:
一个线程完成自己的任务,去通知另一个线程开始另一个任务
Wait();等待 如果线程执行了wait方法,那麽该线程就会处于等待状态,等待状态的线程必须要通过其他线程来调用notify();方法唤醒。
notifyAll();
所有的在等待的线程。
wait() :等待需要等其他线程调用notify()来唤醒
线程会放到线程池中进行等待。
notify() :唤醒 随机唤醒线程池中的一个线程
notifyAll():唤醒所有等待线程。
wait方法和notify方法都是Object中的方法。
wait方法和notify只能由锁对象来调用。
wait方法和notify只能在同步线程中使用。
join方法 加入:可以在一个线程执行中,加入另外一个线程执行,前面的线程会等待加入的线程执行完毕后再执行。
线程的停止:
1.停止一个线程 一般是通过一个变量来控制
2.如果需要停止一个处于一个等待状态的线程,那么需要配合interrupture方法来完成。
interrupt();把等待的线程强制清除
notify();唤醒
守护线程(后台线程):在一个进程中只剩下守护线程,守护线程也会死掉
模拟文件下载:
一个线程默认不是守护线程。
demo2.setDaemon(true); // boolean : true表示这个线程为守护线程 ,false表示该线程为一般线程。
第十八天--------------
IO流:
(Input OutPut) 输入输出流 :
1.输入 : 将文件读到内存中
2.输出:将文件从内存输出到其他地方。
IO技术的作用 :
主要就是解决设备和设备之间的数据传输问题。比如:硬盘到---》内存 ,内存数据---》硬盘中 把键盘中的数据写入到内存。
IO的应用场景:
比如:打卡机到出信息表
比如:注册的时候图片的上传。
比如:下载功能
解析XML
数据保存到本地,数据一个永久保存。数据保存到磁盘上是以文件的形式存在的。所以现在学习文件的操作。
java中如何操作文件 :
java中是通过File文件类来操作文件和文件夹。
将U盘中的文件 拷贝到电脑中 : 输入流--->读到内存-->通过输出流读到电脑磁盘中。
学习文件类的构造方法:
File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建一个新File实例。
File file = new File("D:\\a.txt");
File(File parent, String child)
根据parent抽象路径名和child路径名字符串创建一个新File实例。
File file1 = new File(parent, "a.txt");
File(String parent, String child)
根据parent路径名字符串和child路径名字符串创建一个新File实例。
File file2 = new File("D:"+File.separator, "a.txt");
java是跨平台的 不同的操作系统上都可以来运行
不同的系统目录的分隔符是不一样。
目录的分隔符:
在Windows系统上 目录分隔符 :\,但是Linux系统上的目录分隔符是/
注意点:在Windows上\或者/都可以作为目录的分隔符。 如果你用的反斜杠 目录分隔符就是\\如果使用/直接用/就可以分隔。
路径问题:
1.绝对路径:文件在硬盘上的完整路径。绝对路径一般都是以盘符开头D:\\a.txt绝对路径
2.相对路径:相对路径就是资源文件相对当前程序所在的路径
File中常用的方法:
创建:
CreateNewFile()在指定位置创建一个空文件,成功就返回true,如果已存在就不创建然后返回false
mkdir()在指定位置创建目录,这只会创建最后一级目录,如果上级目录不存在就抛异常。
mkdirs()在指定位置创建目录,这会创建路径中所有不存在的目录。
renameTo(File dest)重命名文件或文件夹,也可以操作非空的文件夹,文件不同时相当于文件的剪切,剪切时候不能操作非空的文件夹。移动/重命名成功则返回true,失败则返回false。
删除:
delete()删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除,成功返回true,失败返回false。
deleteOnExit()在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除
判断方法:
exists()文件或文件夹是否存在。
isFile()是否是一个文件,如果不存在,则始终为false。
isDirectory()是否是一个目录,如果不存在,则始终为false。
isHidden()是否是一个隐藏的文件或是否是隐藏的目录。
isAbsolute()测试此抽象路径名是否为绝对路径名。
获取方法:
文件相关:
getName()获取文件或文件夹的名称,不包含上级路径。
getPath()返回绝对路径,可以是相对路径,但是目录要指定
getAbsolutePath()获取文件的绝对路径,与文件是否存在没关系
length()获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。
getParent()返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。
lastModified()获取最后一次被修改的时间。
文件夹相关:
staic File[] listRoots()列出所有的根目录(Window中就是所有系统的盘符)
list()返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。
list(FilenameFilter filter)返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
listFiles()返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。
listFiles(FilenameFilter filter)返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
第十九天--------------
Io流:作用:用于在设备于设备之间的数据传输
IO流:用于操作文件数据
IO流的分类:
1.字节流:读取的是文件的二进制数据,不会对二进制做处理。不会解析成看得懂的数据
2.字符流:读取的也是二进制数据,他会将二进制数据转换为我们能识别的字符(解码)。字符流是以字符为单位的
字符流=字节流+解码
流按照的方向:输入流和输出流。
判断流是输出还是输入:
是以当前的应用程序作为参考,观察数据是流入还是流出,如果是流入就是输入,如果是流出就是输出。
字节流
InputSream:此抽象类是表示 字节输入流和输出流所有类的父类。
如何判断一个流值字节输入流:
判断一下他的类名是否以InputStream结尾
使用FileInputStream:是InputStream的子类
字节输入流:
1.找到目标文件
File f = new file(路径);
2.建立:通到
FileInputSream f = new FileInputSream(f);
3.创建缓冲区[可有可无]
byte[] b = new byte byte[1024];
4.读取数据
5.关闭资源(释放资源)
字节输出流:
OutputStream:她也是所有输出流的父类,也是一个抽象类,使用子类创建。
1.找到目标文件
File file = new File(path);
2.创建一个通到
FileOutputStream out = new FileOutputStream();
3.创建一个缓冲区
4.关闭资源
注意事项:
1.如果写入的目标文件不存在,会自动创建一个目标文件。
2.如果目标文件存在,先将里面的数据清空,再写入数据。
3.如果目标文件存在,现要在原有的数据上面添加,那麽可以使用FileOutputStream(File file,boolean append)构造方法。
4.用write(int a);方法写数据,虽然接收的是int,实际上只有一个字节的数据,操作的低8位的字节,其他的全丢掉。