线程实现的两种方式

因为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对象, 匿名对象是一个一次性的对象, 即: 这个对象只能存在一次.