zoukankan      html  css  js  c++  java
  • java学习day16--API-多线程创建两种方式

    线程实现的两种方式

    因为cpu的调度不可控, 所以每次执行的结果可能不懂

    继承Thread

    Thread 类

    常用构造方法

    方法 说明
    Thread() 无参构造
    Thread(Runnable target) 传入一个继承了Runnable接口的对象

    常用方法

    修饰符和返回值 方法 说明
    static Thread currentThread() 返回对当前正在执行的线程对象的引用。
    long getId() 返回该线程的标识符。
    String getName() 返回该线程的名称。
    void run() 一般每个线程要执行的代码都放在run()方法里, 注意: 直接执行run()相当于执行普通方法, 启动线程必须执行start()
    void setName(String name) 设置线程名称
    static void sleep(long millis) 线程休眠, 单位: 毫秒
    void start() 使该线程开始执行
    void stop() 停止该线程

    代码示例

    普通方法

    public class Test1_Thread {
        public static void main(String[] args) {
            MyThread target = new MyThread();
    
            // 执行run()...
            // target.run(); // 可以执行业务, 但是没有多线程效果, 相当于普通方法
            // 应执行start()启动线程
            target.start(); // 从新建状态变成了可运行状态, 等待cpu调度
        }
    }
    
    // 继承Thread类
    class MyThread extends Thread {
        @Override
        public void run() {
            // 线程执行的代码
        }
    }
    

    匿名对象方式

    new Thread(){
        public void run() {
    		// 线程执行的代码
        }
    }.start();
    

    实现Runnable接口

    接口方法

    返回值 方法 说明
    void run() 每个线程要执行的代码

    代码示例

    普通实现方式

    public class Test2_Runnable {
        public static void main(String[] args) {
            MyRunnable mr = new MyRunnable();
            Thread  t = new Thread(mr);
            t.start();
        }
    }
    
    class MyRunnable implements Runnable {
        @Override
        public void run() {
            // 线程执行的代码
        }
    }
    

    匿名内部类方式

    Runnable r2 = new Runnable() {
        public void run() {
    		// 线程执行代码
        }
    };
    new Thread(r2).start();
    
    // 可简写为
    new Thread(new Runnable() {
       public void run() {
    		// 线程执行代码
        }
    }).start();
    

    lambad表达式

    • Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。
    • JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。

    对接口的要求: 虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法

    这里只介绍Lambad表达式的接口用法, 详细用法请 点击这里

    使用lambad表达式实现线程

    Thread t2 = new Thread( () -> {
        // 线程要执行的代码
        // 如果执行的代码只有一行, 大括号可以省略
    });
    t2.start();
    

    匿名内部类和匿名对象

    • 匿名内部类: 不需要类名, new一个接口

      众所周知, 接口不能被实例化, 但是new一个接口的代码是可行的, 但是, 这并不表示这个接口被实例化了, 而是实例化了一个没有名字的类. 如下代码: (以下代码和线程无关)

      // main方法中的代码
      new Runnable() {
          @Override
          public void run() {
      		// 方法体
          }
      };
      

      实际上他是这样的

      class 匿名 implements Runnable {
          @Override
          public void run() {
              // 方法体
          }
      }
      // 下面是main方法中的代码
      new 匿名().run();
      

      匿名内部类是一个一次性的类. 即: 这个类只能被实例化一次, 且这个类的方法也只能执行一次

    • 匿名对象: 不需要变量, new一个对象

      匿名对象 比如: new Thread()这样的, 一个没有名字的Thread对象, 匿名对象是一个一次性的对象, 即: 这个对象只能存在一次.

  • 相关阅读:
    数据分析之可反复与独立样本的T-Test分析
    朗朗上口的两幅对联
    mysql编码、数据表编码查看和改动总结
    2014-04-19编程之美初赛题目及答案解析
    测试集群模式安装实施Hadoop
    笔记:常用排序算法
    笔记:常用排序算法
    安装Redis并测试
    常见架构风格举例总结
    转载:PostgreSQL SQL的性能提升
  • 原文地址:https://www.cnblogs.com/liqbk/p/12940097.html
Copyright © 2011-2022 走看看