/**
 * 基础知识:
 *      线程:线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序控制的流程,但与进程不同的
 * 是,同类的多个线程是共享一块内存空间和一组系统资源。所以系统在各个线程之间切换时,开销要
 * 比进程小的多,正因如此,线程被称为轻量级进程。一个进程中可以包含多个线程。
 *          主线程:
 *      Java程序至少会有一个线程,这就是主线程,程序启动后是由JVM创建主线程,程序结束时由JVM停
 *      止主线程。主线程它负责管理子线程,即子线程的启动、挂起、停止等等操作。图23-2所示是进程、
 *      主线程和子线程的关系,其中主线程负责管理子线程,即子线程的启动、挂起、停止等操作
 */
public class Test implements Runnable {
    //代码案例
    //编写执行代码
    @Override
    public void run() {
        for (int i=0;i<10;i++){
            //打印次数和线程名字
            System.out.println("第"+i+"次执行"+Thread.currentThread().getName());
            //随机生成休眠时间


            long sleepTime = (long) (1000 * Math.random());

        }
        //线程结束
        System.out.println("执行完成"+Thread.currentThread().getName());
    }

//        获得主线程
//        Thread mainThread= Thread.currentThread();
//        getName();获得线程的名称,主线程是main由JVM分配
//        System.out.println("主线程名称:"+mainThread.getName());
        /**
         *          创建子线程:
         * Java中创建一个子线程涉及到:java.lang.Thread()类和java.lang.Runnable接口。
         * Thread是线程类,创建一个Thread对象就会产生一个新的线程。。而线程执行的程序代码是在实现Runnable接口
         * 对象的run()方法中编写的,实现Runnable接口对象是线程执行的对象
         *
         * 线程执行对象实现Runnable接口的run()方法,run()方法是线程执行的入口,该线程要执行程序代码都是在此编写的
         * run方法称为线程体
         *
         *
         *          提示:
         *          主线程中执行入口是main(String[] args)方法,这里可以控制程序的流程,管理其他的子线
         *          程等。子线程执行入口是线程执行对象(实现Runnable接口对象)的run()方法,在这个方法可以
         *          编写子线程相关处理代码。
         *
         */
        /**
         *      实现Runnable接口
         *      创建线程Thread对象时,可以将线程执行对象传递给他这时需要Thread类下的两个构造方法
         * 1.Thread(Runnable target,String name);target是线程执行对象,实现Runnable接口。name为线程的名字
         * 2.Thread(Runnable target);target是线程执行对象,实现Runnable接口。
         */
        public static void main(String[] args) {
            //创建线程t1,参数是一个线程执行对象Test
            Thread t1=new Thread(new Test() );
            //开始执行t1
            t1.start();

            //创建线程t2,参数古是一个线程执行对象Test
            Thread t2=new Thread(new Test(),"MyThread");
            //开始执行线程t2
            t2.start();
        }

    /**
     * 上述代码创建了两个子线程,见代码第①行和第③行,构造方法参数是线程执行对象Runner,其中代
     * 码第①行的构造方法没有指定线程的名字,代码第③行的构造方法指定了线程名字。线程创建完成还
     * 需要调用start()方法才能执行,见代码第②行和第④行,start()方法一旦调用线程进入可以执行状态,
     * 可以执行状态下的线程等待CPU调度执行,CPU调用后线程进行执行状态,运行run()方法。
     */


}
/**
 * 继承Thread线程类
 * 事实上Thread类方法也实现了Runnable接口,所以Thread类也可以作为线程执行对象,这需要继承Thread类,覆盖run方法
 *
 */
//线程执行对象
public class MyThread extends Thread{
    public MyThread(){
        super();
    }
    public MyThread(String name){
        super(name);
    }
    //编写执行线程代码


    @Override
    public void run() {
        for (int i=0;i<10;i++){
            //打印次数和线程的名字
            System.out.println("执行了第"+i+"次"+getName());
            long sleepTime=(long) (1000*Math.random());
        }
        System.out.println("线程执行结束"+getName());
    }

    public static void main(String[] args) {
        //创建线程t1
        Thread t1=new Thread(new MyThread());
        t1.start();
        //创建线程t2
        Thread t2=new Thread("MyThread");
        t2.start();
    }
}