/*
* 多线程:
*
* 进程:正在进行中的程序。
* 每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者是一个控制单元。
* 线程:就是进程中的一个独立控制单元,线程在控制着进程的执行。
*
* 一个进程中至少有一个线程。
*
* java vm 启动的时候会有一个进程:java.exe;
* 该进程中至少有一个线程负责java程序的执行;
* 而且该线程的代码在main方法中运行,该线程成为主线程。
*
* 扩展:更细节说明JVM启动的不止一个线程,还有负责垃圾回收机制的线程。
*
* 线程的创建:
*
* 一:继承Thread,复写run()方法;
* 步骤: 1.类继承Thrand ;
* 2.复写run()方法 ;
* 目的:将要线程要运行的代码写在run()方法中,让线程运行;
* 3.实例化类对象 ;
* 4.调用start()方法;该方法有两个作用:1.启动线程,2.调用run()方法;
* 如果只调用run()方法,则只是对象调用方法,而没有开启线程;
*
* 当多个线程时,cpu把执行权给谁的时候,那个线程运行;
* 在同一时间,只能有一个程序运行;(多核除外) cpu在瞬间做着快速切换,以达到看上去同时运行;
* 可以形象的看作多个线程在抢夺cpu的执行权;
* 多线程的特性:随机性;谁抢到谁执行,至于执行多长时间,cpu决定;
*
* 为什么要复写run()方法?
* Thread 类用于描述线程;
* 该类就定义了一个功能,用于存储线程要运行的代码,这个存储功能就是run()方法;
*
*
* * * * * * * * * * * * *
* *
* main *
* | (main线程) *
* \|/ *
* r = new Resources(); *
* r.start();————————————| (r线程) *
* | | *
* \|/ \|/ *
* "hello main" "hello Resources" *
* | | *
* *
* * * * * * * * * * * * *
*
* 二:实现Runnable接口,复写run()方法;
*
* 步骤:
* 1,定义了实现Runnable接口。
* 2,覆盖接口的run方法。将多线程要运行的代码存入其中。
* 3,创建Thread类的对象(创建线程),并将Runnable接口的子类对象作为参数传递给Thread的构造函数。
* 为什么要传递?因为线程要运行的代码都在Runnable子类的run方法中存储。所以要将该run方法所属的对象
* 传递给Thread。让Thread线程去使用该对象调用其run方法。
* 4,调用Thread对象的start方法。开启线程。
*/
package com.Thread;
public class ThreadDemo3 {
public static void main(String[] args) {
Resources r = new Resources();
r.start();
for(int i=0;i<50;i++)
System.out.println(i+"hello main");
}
}
class Resources extends Thread {
int num = 50;
public void run() {
while (num > 0) {
System.out.println(num + "hello Resources");
num--;
}
}
}
</pre><pre class="java" name="code">