网络编程

网络编程

TCP/IP四层概念模型

  1. 应用层

  2. 传输层

  3. 网络层

  4. 数据链路层

IP,端口

  1. IP找到具体地址 PC电脑
  2. 端口定位到电脑上的具体程序
    1. 查看所有端口 netstat -ano
    2. 端口分类:0~1023 公有端口电脑程序自带使用,1024~49151程序注册端口 49152~65535 动态、私有

多线程

  1. 把jar导入lib文件夹,点击Add as Library就可以直接使用了

  2. 多线程的实现 ,实现Runnable接口,重写Run方法,New Thread去.Start()执行

    public class testThread1 implements Runnable{
        @Override
        public void run() {
            for (int i=0;i<1000;i++){
                System.out.println("用Runnable接口实现多线程"+i);
            }
        }
        public static void main(String[] args) {
            testThread1 t1=new testThread1();
            new Thread(t1).start();
        }
    }
    

    3.Lambda表达式 (接口为函数试接口可以简化为Lambda表达式,函数式接口:接口只有一个方法)

    public class anonymous {
        public static void main(String[] args) {
            //匿名内部类 (接口NEW接口 大括号里面重写RUN方法)
            Runnable anonymousClass = new Runnable() {
                @Override
                public void run() {
                    System.out.println("匿名内部类!");
                }
            };
            anonymousClass.run();
    
            Runnable lambdas = ()->{
                    System.out.println("Lambda表达式! ");
            };
            //如果Lambda表达式只有一行可以简化为一行,有多行必须用代码块包裹
            lambdas=()->System.out.println("Lambda表达式简化! ");
            //只有一个传值时,可以去掉括号和参数类型lambdas= a->System.out.println("Lambda表达式简化! ");
            //只有多个传值时,参数类型可以全部去掉,或者全部加上,必须加()  (int a,string b)->System.out.println("Lambda表达式简化!");
            lambdas.run();
        }
    }
    

    4.终止线程,使用一个标识位flag终止线程运行(不要使用stop等官方不建议的方法)

    public class threadStop implements Runnable {
        private boolean flag = true;
        int i =0;
        public void run(){
            while (flag){
                    System.out.println("Thread ... Run" + i++);
            }
        }
        public void stop(){//自己写是stop方法,不要用官方JDK中不建议的stop方法
            this.flag=false;
        }
        public static void main(String[] args) {
            threadStop ts=new threadStop();
            new Thread(ts).start();
            for (int i=0; i < 1000; i++) {
                System.out.println("Thread ... Main" + i);
                if (i == 666) {
                    ts.stop();
                    System.out.println("Thread 终止 .........." + i);
                }
            }
        }
    }
    

    5.每个对象都有一把锁,sleep不会释放锁,

    Yield线程礼让,如果A在CPU执行,则A退出CPU,CPU随机让A或B其中一个线程重新调度执行,礼让不一定成功

    Join合并线程,待此线程执行完成后,在执行其他线程,可以想象为插队

    线程分用户线程和守护线程

    用户线程如:Main线程,虚拟机必须确保用户线程执行完毕

    守护线程如:GC回收线程,虚拟机不用等待守护线程执行完毕

    接口NEW接口 大括号里面重写RUN方法(匿名内部类) Runnable anonymousClass = new Runnable() {
                @Override
                public void run() {
                    System.out.println("匿名内部类!");
                }
            };
    接口NEW继承这个接口的Class类,Class类里面重写接口Run方法,NEW的对象点接口里方法实现Class里重写的方法
    Runnable lambdas = ()->{
                    System.out.println("Lambda表达式! ");
            };
    lambdas.run();
    
  3. 线程同步:多个线程操作同一个资源

    并发:同一个对象被多个线程同时操作(安全性:队列+锁)

    同步方法 在方法前加修饰Synchronize 同步的是它本身this

    同步块:Synchronize(Obj){} Obj锁的对象就是变化的量,需要增删改的对象

  4. Lock锁 使用的优先顺序: Lock > 同步代码块 > 同步方法

    class A{
            private final ReentrantLock lock=new ReentrantLock();
        public void m(){
            lock.lock();
            try {
                //保证线程安全的代码;
            }finally {
                lock.unlock();
                //如果同步代码有异常,需要将unlock()写入finally语句块
            }
        }
    }
    
  5. 线程通信 : 管程法(缓冲区) 信号灯法 (flag使用标志位)

    线程池: ExecutorService \ Executors

posted @ 2021-06-24 18:23  DingGuo  阅读(36)  评论(0编辑  收藏  举报