线程的两种创建方式:Thread类和Runnable接口,它们都要复写run方法

时间:2021-05-14 17:31:32
/*线程:
* 1.如何在自定义的代码中,自定义一个线程呢?
*
* 通过对API的查找,java已提供了对线程这类事物的描述。就是Thread类
*
* 创建线程的第一种方式:继承Thread类。
* 步骤:
* 1.定义类继承Thread。
* 2.复写Thread中的run方法,让线程运行。
* 目的:将自定义方法存储在run方法中,让线程运行。
* 3.调用线程的start方法
* 该方法有两个作用:启动线程和调用run方法。
*
* 创建线程的第二种方式:实现Runnable接口。
* 步骤:
* 1.定义类实现Runnable。
* 2.复写Runnable中的run方法
* 3.new一个Thread类,将自定义类丢进去。再调用该类的start方法启动线程
*
* 发现运行结果每一次都不同。
* 因为多个线程都获取CPU的执行权。CPU执行到谁,谁就运行。
* 明确一点来说,就是在某一时刻,只能有一个程序在运行。(多核CPU除外)
* CPU在做着快速的切换,以达到看上去是现行在运行的效果。
* 我们可以形象的把多线程的运行行为理解为它们在互相争夺CPU的执行权。
*
* 这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长时间CPU说了算。
*
* 为什么要复盖run方法呢?
*
* Thread类用于描述线程。
* 该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。
*
* 也就是说Thread类中的run方法,用于存储线程要运行的代码。
*
* 以下示例中应该有4个线程
* 1.主方法执行线程,存在main方法中
* 2.jvm的内存垃圾回收机制,程序边运行,它边执行。
* 3.自定义的Demo1线程
* 4.自定义的Demo2线程
*
*/
public class Thread_Demo1 {

public static void main(String[] args) {
// 实例化自定义类
Demo1 d1 = new Demo1();
Demo2 d2 = new Demo2();

// 启动线程
d1.start();
new Thread(d2).start();

for (int i = 0; i < 500; i++) {
System.out.println("main----" + i);
}

}

// 自定义一个类继承Thread类
public static class Demo1 extends Thread {

public void run() {
for (int i = 0; i < 500; i++) {
System.out.println("Demo1----" + i);
}
}
}

// 自定义一个类实现Runnable接口
public static class Demo2 implements Runnable {
// 现实run方法
public void run() {
for (int i = 0; i < 500; i++) {
System.out.println("Demo2----" + i);
}
}
}
}