网络编程、多线程与lambda表达式

网络编程

  • public class InetAddress extends Object implements Serializable:这个类代表一个互联网协议(IP)地址。
    • public static InetAddress getByName(String host):在给定主机名的情况下确定ip地址
    • public static InetAddress getLocalHost():返回本地主机
    • public String getHostName():获取此IP地址的主机名
    • public String getHostAddress():返回IP地址字符串(文本)
    • public byte[] getAddress():返回此对象的原IP地址

多线程

  • 创建线程方式一:继承Thread类,重写run()方法,调用start()开启线程

    • 子类继承Thread类具备多线程能力
    • 启动线程:子类对象.start()
    • 不建议使用:避免OOP单继承局限性
  • 创建线程方式二:实现Runnable接口,重写run()方法.newThread()丢入Runnable接口实现类,调用start()开启线程

    • 实现Runnable具备多线程能力
    • 启动线程:传入目标对象+Thread对象.start()
    • 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
  • 创建线程方式三:实现callable接口,重写call方法(有返回值)

  • FutureTask future = new FutureTask(new MyThread3());

    • new Thread(future)执行该线程,get()方法获取重写call()方法的返回值

    • //创建执行服务
      ExecutorService ser = Executors.newFixedThreadPool(3);
      //提交执行
      Future<Boolean> r1 = ser.submit(dowmload1);
      //获取结果
      Boolean rs1 = r1.get();
      System.out.println(rs1);
      //关闭服务
      ser.shutdown();
      
  • 并发问题:多个线程操作同一资源,线程不安全,会出现数据紊乱

  • 停止线程

    • 推荐线程自己停下来,建议使用标志位,当flag=false,则线程终止运行

    • public void stop(){this.flag = false;}	//停止线程
      
  • 线程休眠

    • sleep(时间)指定当前线程阻塞的毫秒数,存在异常InterruptedException,sleep时间达到后线程进入就绪状态,sleep可以模拟网络延迟,倒计时等,每一个对象都有一个锁,sleep不会释放锁;
    System.out.println(new SimpleDateFormat("HH:mm:ss").format(new Date()));
    Thread.sleep(1000);
    
  • 线程礼让

    • thread.yield()

    • 让当前正在执行的线程暂停,但不阻塞,将线程从运行状态转为就绪状态,让cpu重新调度,礼让不一定成功,看cpu心情

  • 线程插队

    • thread.join();
  • state(状态)

    • 获取线程状态thread.getState();

    • while(state!=Thread.State.TERMINATED)//只要线程不终止就一直输出
      
  • 线程优先级

    • getPriority():获取优先级
    • setPriority():设置优先级
  • 守护线程

    • setDaemon():默认为false用户线程,设置为true则为守护线程,例如gc,建议在start之前;
  • Synchronized和Lock比较.

    • Synchronized是关键字,内置语言实现,Lock是接口。. Synchronized在线程发生异常时会自动释放锁,因此不会发生异常死锁。. Lock异常时不会自动释放锁,所以需要在finally中实现释放锁。. Lock是可以中断锁,Synchronized是非中断锁,必须等待线程执行完成释放锁。. Lock可以使用读锁提高多线程读效率。

    • //定义lock锁
      private final ReentrantLock lock = new ReentrantLock();
      
  • 线程池

    • ExecutorService和Executors--工具类

    • ExecutorService:真正的线程池接口,常见子类ThreadPoolExecutor

    • void execute(Runable command):执行任务、命令,没有返回值,一般用来执行Runnable

    • Future submit(Callable task):执行任务,有返回值,一般来执行Callable

    • void shutdown():关闭连接池

    • //创建线程池
      ExecutorService service = Executors.newFixedThreadPool(10);
      //添加线程
      service.execute(new Thread(new MyThead(),"x"));
      service.execute(new Thread(new MyThead(),"y"));
      service.execute(new Thread(new MyThead(),"z"));
      //关闭线程池
      service.shutdown();
      

lambda表达式

  • lambda表达式只能有一行代码的情况下才能简化成一行,如果多行,则用代码块包裹
  • 前提是接口为函数式接口
  • 多个参数也可以去掉参数类型,要去掉都去掉,必须加上括号
  • new Thread( ()->{sout} );
posted @ 2022-03-07 21:01  ice204  阅读(44)  评论(0)    收藏  举报