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

时间:2021-02-27 17:31:57
/*线程:
 * 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);
			}
		}
	}
}