线程创建的两种方法

在java平台中创建一个线程就是创建一Thread类(或其子类)的实例。

run()方法:线程的任务处理逻辑可以致在Thread类run方法中直接实现或者通过该方法进行调用,因此相当于线程任务处理逻辑的入口方法,他由java虚拟机在运行相应线程是直接调用,而不是由应用代码进行调用。

线程启动:线程的启动调用start()方法,请求Java虚拟机运行相应的线程,而进程具体何时运行是线程调度器(Scheduler)决定的。因此start()方法调用结束并不意味着相应线程已经开始运行。

创建线程的两种方法

Thread类的两个常用构造器:Thread()和Thread(Runnable target),相应的创建线程方式有两种。

  • 第一种:定义Thread子类,在改子类中重写run方法并在该方法中直接实现线程的逻辑。
  • 第二种:创建一个java.land.Runable接口的实例,在Runble实例中实现任务逻辑,然后以该Runable接口的实例作为构造器参数直接创建(new)一个Thread类实例。

继承Thread方式创建线程:

//定义Thread子类方式创建线程
public class WelcomeApp {
  public static void main(String[] args) {
    // 创建线程
    Thread welcomeThread = new WelcomeThread();
    // 启动线程
    welcomeThread.start();
    // 输出“当前线程”的线程名称
    System.out.printf("1.Welcome! I'm %s.%n", Thread.currentThread().getName());
  }
}

// 定义Thread类的子类
class WelcomeThread extends Thread {
  // 在该方法中实现线程的任务处理逻辑
  @Override
  public void run() {
    System.out.printf("2.Welcome! I'm %s.%n", Thread.currentThread().getName());
  }
}

实现Runnable接口方式创建线程:

public class WelcomeApp1 {
  public static void main(String[] args) {
    // 创建线程
    Thread welcomeThread = new Thread(new WelcomeTask());

    // 启动线程
    welcomeThread.start();
    // 输出“当前线程”的线程名称
    System.out.printf("1.Welcome! I'm %s.%n", Thread.currentThread().getName());
  }
}

class WelcomeTask implements Runnable {
  // 在该方法中实现线程的任务处理逻辑
  @Override
  public void run() {
    // 输出“当前线程”的线程名称
    System.out.printf("2.Welcome! I'm %s.%n", Thread.currentThread().getName());
  }
}

一旦线程run方法执行(由java虚拟机调研)结束,相应的线程也就结束。当然run方法执行结束包括:正常结束、抛出异常终止。运行结束的线程所占的资源会如同其他java对象一样被java虚拟机回收。

线程属于一次性用品,不能重复调用,start方法只能调用一次,否则会抛出illegalThreadStateException

两种创建线程方法区别:

  1. 基于继承技术,创建Thread的子类
  2. 已Runnable接口实例为构造器参数,直接通过new创建线程实例,是一种基于组合的技术。

组合向相对于继承来说类的耦合性更低,更加灵活,所以优选组合技术。

原文地址:https://www.cnblogs.com/sanzashu/p/11058630.html