• 多线程编程和网络编程入门


    1.进程和线程的区别
    (1)进程:
    资源管理的最小单位
    独立的内存空间
    包含一个或多个线程
    (2)线程:
    程序执行的最小单位
    拥有独立的栈空间
    (3)进程类(Process)
    (4)线程体(Java的线程是通过java.lang.Thread类来实现的每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体(即线程的可执行代码))
    (5)主线程
    在任何Java程序启动时,一个线程立刻运行(即mian方法对应的线程),该线程通常称为程序的主线程
    主线程的特点 :
    它是产生其他子线程的线程
    它不一定是最后完成执行的线程,子线程可能在它结束之后还在运行

    2.创建线程的两种方式
    (1)方式一:用Thread类创建线程
    声明为一个 Thread 类的子类,并覆盖 run() 方法
    class MyThread extends Thread {
    public void run( ) {
    /* 覆盖该方法*/
    }
    }
    当使用继承创建线程,这样启动线程:
    new MyThread().start();

    (2)方式二:使用Runnable接口创建多线程
    声明为一个实现 Runnable 接口的类,并实现 run() 方法
    class MyThread implements Runnable{
    public void run() {
    /* 实现该方法*/
    }
    }
    当使用实现接口创建线程,这样启动线程:
    new Thread(new MyThread()).start();

    3.java.lang.Thread类的常用方法
    (1)静态方法
    currentThread() 返回当前线程实例
    sleep(long millis) 当前线程休眠
    yield() 当前线程停顿
    dumpStack() 打印当前线程的调用栈
    (2)常用方法
    start() 启动该线程,将导致run方法被自动调用
    run() 必须覆盖该方法,在方法体中添加线程逻辑代码
    interrupt() 用于将一个中断请求发送给线程
    interrupted() 用于测试当前线程是否已经被中断
    isInterrupted() 用于测试某个线程是否已经被中断
    isAlive() 用于测试某个线程是否还活着
    setPriority(int newPriority) 设置线程的优先级
    join( ) 等待线程结束
    (3)两种创建线程方法的比较
    使用Runnable接口:
    可以将代码和数据分开,形成清晰的模型
    还可以从其他类继承
    保持程序风格的一致性

    直接继承Thread类:
    不能再从其他类继承
    编写简单,可以直接操纵线程
    无需使用Thread. currentThread()

    4.线程的四种状态
    (1)
    这里写图片描述

    (2)守护线程:
    守护线程是为其它线程提供服务的线程,如定时器线程
    守护线程一般应该是一个独立的线程,它的run()方法是一个无限循环
    守护线程与其它线程的区别是:如果守护线程是唯一运行着的线程,程序会自动退出
    把线程变成一个守护线程:t .setDeamon(true);

    (3)线程的调度
    Java提供一个线程调度程序来监控程序中启动后进入可运行状态的所有线程
    线程调度程序按照线程的优先级决定应调度哪些线程执行
    多数线程的调度是抢占式的
    -时间片方式(time slicing)
    -非时间片方式

    下面几种情况下,当前线程会放弃CPU
    线程调用了yield()或sleep()方法主动放弃
    由于当前线程进行I/O访问,外存读写,等待用户输入等操作,导致线程阻塞
    为等候一个条件变量,线程调用wait()方法
    抢先式系统下,有高优先级的线程参与调度;时间片方式下,当前时间片用完,有同优先级的线程参与调度

    (4)线程的优先级
    在java中,每一个线程都有一个优先级。默认情况下,一个线程将继承其父线程的优先级。线程的优先级用数字来表示,范围从1到10,一个线程的缺省优先级是5
    Thread.MIN_PRIORITY = 1
    Thread.MAX_PRIORITY = 10
    Thread.NORM_PRIORITY = 5
    使用下述线方法获得或设置线程对象的优先级
    int getPriority();
    void setPriority(int newPriority);

    5.同步和锁
    (1)同步:为了确保在任何时刻一个共享对象只被一个线程使用,必须使用“同步(synchronized)”
    有两种方式实现同步:
    使用同步方法
    synchronized void methodA() { }
    使用同步块
    synchronized(obj){//obj是被锁定的对象
    //要同步的语句
    }

    (2)同步原理:每个对象拥有自己的锁,对于同一个锁,不能有两个线程同时访问

    (3)死锁:当所有的线程都在等待得到某个资源后才能继续运行下去时,整个程序将被挂起,这种情况就叫做死锁

    (4)多线程协作-wait和notify
    wait
    类似于sleep,当前线程休眠
    释放自己占用的锁(不同于sleep)
    可以指定休眠的时间,也可不指定

    notify/notifyAll
    唤醒正在wait状态等待当前锁的线程
    notifyAll唤醒所有wait状态的线程
    notify只唤醒一个wait状态的线程

    (5)interrupt 打断线程的等待

    6.ThreadLocal
    用来为每个线程保存一个变量
    操作
    初始化(使用泛型)
    ThreadLocal counter= new ThreadLocal();
    保存一个值
    counter.set(1);
    读取一个值
    int i=counter.get()
    删除保存的值
    counter.remove();

    7.URL及其操作类
    (1)URL格式:
    这里写图片描述
    URI是统一资源标识符,而URL是统一资源定位符。笼统地说,每个URL都是 URI,反之则不一定。这是因为URI还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源
    为了表示URL,java.net中实现了类URL。类URL的常见构造方法如下
    URL urlBase=new URL(“http://www. 263.net/”)
    URL net263=new URL (“http://www.263.net/“)
    URL index263=new URL(net263, “index.html”)
    new URL(“http”, “www.gamelan.com”, “/pages/Gamelan.net work.html”);

    8.基于Java 自身技术实现消息方式系统通讯
    在网络协议上java 支持TCP/IP 和UDP/IP
    在网络IO 操作上java 支持BIO 和NIO
    因此在java 中有四种方法可实现基于消息方式的系统间通讯
    TCP/IP+BIO
    TCP/IP+NIO
    UDP/IP+BIO
    UDP/IP+NIO

  • 相关阅读:
    10月27日,每日信息差
    Android改造CardView为圆形View,Kotlin
    什么是日本PSE
    this指向
    [附源码]Python计算机毕业设计Django基于Java的日用品在线电商平台
    汽车销量数据库(分车型、分品牌月度销量数据 2005-2021)
    Redis —— 一次错误记录
    黑*头条_第2章_文章列表前端成形与后端变身
    33. 干货系列从零用Rust编写正反向代理,关于HTTP客户端代理的源码实现
    事件总结-常用总结
  • 原文地址:https://blog.csdn.net/begefefsef/article/details/126565602