线程的实现方式有以下几种:
1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法 3.lambda表达式 4.通过Callable和FutureTask创建线程 5.通过线程池创建线程
这里我们只总结前三点,后面两点后续会在多线程部分详细总结。
废话不多说,直接上代码:
public class GreatThread {
static class MyThread extends Thread {
@Override
public void run() {
System.out.println("我是继承Thread得来的");
}
}
static class MyRun implements Runnable {
@Override
public void run() {
System.out.println("我是实现Runnable得来的");
}
}
public static void main(String[] args) {
new MyThread().start();
new Thread(new MyRun()).start();
new Thread(()->
{
System.out.println("我是lambda表达式得来的");
}).start();
}
}
运行结果如下:
我是继承Thread得来的 我是实现Runnable得来的 我是lambda表达式得来的
阿里代码规范提示:线程资源最好通过线程池提供,不允许在应用中自行显式创建线程。
说明: 使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
lambda表达式说明:
基本语法:
(parameters) -> expression
或
(parameters) ->{ statements; }
常见示例:
// 1. 不需要参数,返回值为 5 () -> 5 // 2. 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x // 3. 接受2个参数(数字),并返回他们的差值 (x, y) -> x – y // 4. 接收2个int型整数,返回他们的和 (int x, int y) -> x + y // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void) (String s) -> System.out.print(s)
综上可以看出,lambda表达式实现多线程和Runnable接口本质上是一样的。
二、线程的状态&&常用方法线程的状态可以参考:线程的生命周期
这里我再结合常用方法详细的画一下线程的运行图,如图所示:



