第13周学习笔记

11.20:io流

——io流

        1.按流向划分:输入流、输出流

        2.按读写方式划分:字节流(InputStream或OutputStream)、字符流(Reader或Writer)

        注意io流对象不会被自动回收,所以在使用完后需要调用close方法去关闭资源。

——(1)文件流

文件字节流:FileInputStream、FileOutputStream底层是byte型数组,用于文件的读写,但是读写效率慢

文件字符流:FileWriter、FileReader,底层是char型数组,用于文件的读写,效率比字节流更快

——(2)缓冲流:

缓冲字符流:BufferedWriter和BufferedReader,写入和读取的效率更高。

缓冲字节流:BufferedInputSteam和BufferedoutputStream

——(3)内存流:当输出流的目的,和输入流的源是内存时,这样的流称之为内存流。

内存字节流:ByteArrayOutputStream和ByteArrayInputStream,其中ByteArrayInputStream它是唯一一种能够直接从网络上获取二进制数据的流。

内存字符流:ByteArrayReader和ByteArrayWriter

——(4)转换流:转换流只有字节转字符,没有字符转字节。

字节流  - > 字符流:InputStreamReader和OutputStreamWriter——(5)打印流:用于输出信息的类

PrintStream和PrintWriter都属于输出流,分别针对输出字节和字符。

PrintStream和PrintWriter提供了重载的print()、println()方法用于多种数据类型的输出。

PrintStream和PrintWriter不会抛出异常,用户通过检测错误状态获取错误信息。

PrintStream和PrintWriter有自动flush 功能。

——(对象流):对象流没有字符输入和输出流

ObjectInputStream:   字节流 (对象信息持久化) ->  程序中 -> java对象信息 ,称为反序列化
 ObjectOutputStream:  对象信息 -> 字节流 (对象信息持久化)  ,称为序列化

11.21网络编程:

网络通信协议:计算机之间的链接需要对数据的传输速率、代码结构、传输代码、传输控制步骤、出错控制等制定一组统一的标准。

-七层模型:OSI(Open System Interconnection),其中接触比较多的是物理层和应用层,物理层中其实就是设备, 比如说我们的电脑和鼠标键盘路由器等等东西都是物理层的,而应用层则是手机或者电脑上的一些应用,某些功能
    -数据链路层:如何去调取数据
    -网络层:通过网络传输数据
    -运输层:数据的传输,TCP或者UDP
  

-java网络编程:
    客户端 -> 服务器
    -TCP
    -UDP 
    
    -URL
    -url.getPath获取端口,端口值若为-1,则说明为默认的端口号80

    -InetArray:IP地址
    原始地址其实是byte的数组,而不是我们看到的192.168.31.166

-TCP编程:传输控制协议
    特点:有序可靠的,面向连接,主要是以字节流的方式传输!
    
    客户端和服务器要建立起联系则需要提供IP地址和端口号 
    用于客户端的通信类叫Socke类,作用于服务器的通信类:ServerSocket

-UDP编程:
    UDP用户数据报协议
    特点:面向无连接,不可靠无序的,以数据报的形式发送(DatePacket),高效率
     服务器和客户端的通信类:DatagramSocket
    数据报包类:DatagramPacket

11.22进程和线程

*进程和线程
  每个独立执行的程序称为进程。
  线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源,
  多个线程共享内存,从而极大地提高了程序的运行效率。

  进程与线程的关系
  > 进程的产生,肯定会产生至少一个以上的线程;
  >
  > 进程关闭,该进程内的线程会全部销毁;
  >
  > 线程销毁,进程未必会关闭


  多线程,指的是一个进程内的多个任务并发执行。

  多线程的好处:可以更高效地利用CPU资源,同时,让固定流程的程序更加灵活;

  注意:多个线程之间,谁先抢占到资源,谁就先执行。

多线程的实现方式:
-1.继承Thread类
    重写run方法
    
    ***run方法与start方法区别:
    ——run方法是按顺序去执行,不存在资源的竞争。而start方法则是线程之间存在竞争关系

-2.实现Ruannable接口
    Runnable接口是一个接口但是他只有一个run方法并没有构造方法,所以需要通过Thread去构造一个Runnable的对象
    ——代码示例:    RunThread runThread = new RunThread();
            Thread th1 = new Thread(runThread);
    其优点是:可以使多个线程共享资源,共享RunThread类里面的成员变量和成员方法

-3.实现Callable接口
    Callable(重写call方法)可以抛出异常且有返回值,而Runnable(重写run方法)不能抛出异常且无返回值

    无资源共享,  如果要像Runnable接口那样则需要创建多个Callable接口对象
    ——代码示例:    Callable callable = new CallThread();
                    FutureTask futureTask = new FutureTask(callable);
                    new Thread(futureTask,"FF").start();

11.23

——(1)死锁问题

死锁产生的必要条件:

1> 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用

2> 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。

3> 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占用。

4> 循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路

在我们的项目中,我们不希望看到死锁的发生,为了避免,以上四个条件,破坏其中任意一个,死锁就结束了

注意:过多的同步会导致死锁

——(2)生产者和消费者

生产者与消费者模式就是一个多线程并发协作的模式,在这个模式中呢,一部分线程被用于去生产数据,另一部分线程去处理数据,

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值