美文网首页
进程和线程,IO流,File相关知识点的整理

进程和线程,IO流,File相关知识点的整理

作者: 枇杷树8824 | 来源:发表于2016-12-05 17:39 被阅读187次

    第十七天进程和线程--------

    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位的字节,其他的全丢掉。

    相关文章

      网友评论

          本文标题:进程和线程,IO流,File相关知识点的整理

          本文链接:https://www.haomeiwen.com/subject/qrnqmttx.html