创建线程的两种方法:

  1. 继承Thread类,重写run方法
  2. 实现Runnable接口,重写run方法

一、继承Thread类,创建子线程
我们通过编写一个程序,来理解通过继承Thread类,来创建子线程
开启一个线程,在控制台输出“"喵喵,我是小猫咪”,当输出8次,结束该线程
具体代码如下,注释已经代码中给出,可以体会一下

public class Thread1 {
public static void main(String[] args) throws InterruptedException {
//创建Cat对象,可以当做线程使用
Cat cat = new Cat();

/*
public synchronized void start() {
start0();
}
start0()是本地方法,是JVM调用,底层是c/c++实现
//真正实现多线程的效果,是start0,而不是run
*/
cat.start(); //启动线程 ->最终会执行cat的run方法

System.out.println("主线程继续执行:" + Thread.currentThread().getName()); //线程名main
for (int i = 0; i < 10; i++) {
System.out.println("主线程 i=:" + i);
//让主线程休眠
Thread.sleep(1000);
}
}
}



//1.当一个类继承了Thread类,该类就可以当做线程来使用
//2.我们会重写run方法,写了自己的业务代码
//3.run() 是Thread类,实现了Runnable接口的run方法
/*
@Override
public void run() {
if (target != null) {
target.run();
}
}

*/
class Cat extends Thread {
int times = 0;

@Override
public void run() { //重写run方法,写上自己的逻辑代码
while (true) {
//线程名Thread-0
System.out.println("喵喵,我是小猫咪" + (++times) + "线程名称:" + Thread.currentThread().getName());
try {
//让该线程休眠1秒 ctrl+alt+t
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (times == 8) {
break;
}
}
}
}

运行后的结果,可以看到主线程和子线程是交替执行的

Java 中创建线程的两种方法实现_run


二、实现Runnable接口,实现run方法

说明:java是单继承的,在某些情况下,一个类可能已经继承了一个父类,这时再用继承Thread类方法来创建线程显然是不可能了。

java设计者们提供了另外一个方法创建线程,就是通过实现Runnable接口来创建线程。

接下来编写一个程序来使用这个方法创建子线程,注释已经代码中给出

public class Thread2 {
public static void main(String[] args) {
Dog dog = new Dog();
//创建了Thread对象,把dog对象(实现Runnable接口),放入Thread
Thread thread = new Thread(dog);
thread.start();
}
}

class Dog implements Runnable { //通过实现Runnable接口,开发线程
int count = 0;

@Override
public void run() {
while (true) {
System.out.println("hi" + (++count) + "线程名:" + Thread.currentThread().getName());
try {
//休眠1秒
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
if (count == 10) {
break;
}
}
}
}

运行结果:

Java 中创建线程的两种方法实现_子线程_02


以上就是创建线程的两种方法的基本详解,有不当之处,还望各位指正~