方式1、继承Thread类

       步骤1:定义一个A类然后继承java.lang.Thread类;

       步骤2:在A类中覆盖Thread的run方法;

       步骤3:在run方法中编写需要执行的代码,也就是需要执行的方法体;

       步骤4:在main方法中,创建线程对象,并启动新的线程;

//创建一个类1继承Java.lang.Thread,并覆盖其run方法
class NewThreadA extends Thread {
    public void run(){
        for (int i=0;i<=5;i++) {
            System.out.println("newThreadA"+i)
        }
    }
}
//创建一个类2继承Java.lang.Thread,并覆盖其run方法
class NewThreadB extends Thread {
    public void run(){
        for (int i=0;i<=5;i++) {
            System.out.println("newThreadB"+i)
        }
    }
}
//在main方法中开启线程
public class ExtendsThreadDemo {
    public static void main(String[] args) {
        NewThreadA newThreadA = new NewThreadA();
        NewThreadB newThreadB = new NewThreadB();
        newThreadA.start();
        newThreadB.start(); 
        //newThreadA.run();
        //newThreadB.run();
    }
}
//注意开启新线程时要调用start()方法;如果调用run()方法不会开启新线程,只会执行一个线程

执行结果:

   1、 调用start()方法结果:

java 运行中开启新的进程 java启动新线程_多线程

  2、 调用run()方法结果:

java 运行中开启新的进程 java启动新线程_多线程_02

方式2、实现Runnable接口

     步骤1:定义一个类A,实现java.lang.Runnable接口(注意类A不是线程类)

     步骤2:实现run方法,编写需要执行的代码;即方法体;

     步骤3:在main方法(线程)中,创建线程对象,并启动线程.

//1):定义一个类A继承于java.lang.Thread类.
 //创建一个类1继承Java.lang.Thread,并覆盖其run方法
class NewThreadA implements Runnable {
        public void run(){
            for (int i=0;i<=5;i++) {
                System.out.println("newThreadA"+i);
            }
        }
}
//创建一个类2继承Java.lang.Thread,并覆盖其run方法
class NewThreadB implements Runnable {
        public void run(){
            for (int i=0;i<=5;i++) {
                System.out.println("newThreadB"+i);
            }
        }
}
public class ExtendsThreadDemo {
    public static void main(String[] args) {
        //新建两个对象
        NewThreadA newThread1 = new NewThreadA();
        NewThreadB newThread2 = new NewThreadB();
        //新建两个线程
        Thread thread1 = new Thread(newThread1);
        Thread thread2 = new Thread(newThread2);
        thread1.start();
        thread2.start();
        //thread1.run();
        //thread2.run();
    }
}
//注意开启新线程时要调用start()方法;如果调用run()方法不会开启新线程,只会执行一个线程

执行结果:

   1、 调用start()方法结果:

java 运行中开启新的进程 java启动新线程_新建线程_03

  2、 调用run()方法结果:

java 运行中开启新的进程 java启动新线程_java线程_04

分析继承方式和实现方式的区别:

继承方式:
                1):从设计上分析,Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了.
                2):从操作上分析,继承方式更简单,获取线程名字也简单.(操作上,更简单)
                3):从多线程共享同一个资源上分析,继承方式不能做到.
实现方式:
                1):从设计上分析,Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口,设计更为合理.
                2):从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用

                3):从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源).