1.继承Thread类以创立新线程

该办法将咱们本人定义的一个线程类继承自Thread类,并重写run()办法来重定义该线程所进行的操作。
线程类:

public class Thread1 extends Thread {    // 重写办法重定义该线程进行的操作    @Override    public void run() {        for (int i = 0; i < 10; i++) {            System.out.println(Thread.currentThread().getName() + "执行" + i);        }    }}

测试类:

public class Main {    public static void main(String[] args) {        // 启动线程        new Thread1().start();        for (int i = 0; i < 10; i++) {            System.out.println(Thread.currentThread().getName() + "执行" + i);        }    }}

后果:

main执行0Thread-0执行0main执行1Thread-0执行1main执行2Thread-0执行2main执行3Thread-0执行3main执行4Thread-0执行4main执行5main执行6main执行7main执行8Thread-0执行5main执行9Thread-0执行6Thread-0执行7Thread-0执行8Thread-0执行9

咱们自定义的线程和主线程交替凌乱地执行。

2.实现Runnable以创立新线程

线程类:

public class Thread2 implements Runnable {    // 重写run办法重定义线程执行的内容    @Override    public void run() {        for (int i = 0; i < 10; i++) {            System.out.println(Thread.currentThread().getName() + "执行" + i);        }    }}

测试类:

public class Main {    public static void main(String[] args) {        new Thread(new Thread2()).start();        for (int i = 0; i < 10; i++) {            System.out.println(Thread.currentThread().getName() + "执行" + i);        }    }}

留神这种状况的线程创立形式是将实现了Runnable接口的类填入到Thread办法的构造函数中来创立的,与第一种办法间接创立对应的继承自Thread类的子类的形式有所区别。
执行后果:

Thread-0执行0main执行0Thread-0执行1main执行1Thread-0执行2main执行2Thread-0执行3main执行3Thread-0执行4main执行4Thread-0执行5main执行5Thread-0执行6main执行6main执行7Thread-0执行7main执行8Thread-0执行8main执行9Thread-0执行9

3.匿名外部类

本质上匿名外部类的办法就是实现Runnable接口,只不过这个类没有名字。
测试类:

public class Main {    public static void main(String[] args) {        // 以内部类的形式实现Runnable接口        new Thread(new Runnable() {            // 重写run办法来重定义线程执行的内容            @Override            public void run() {                for (int i = 0; i < 10; i++) {                    System.out.println(Thread.currentThread().getName() + "执行" + i);                }            }        }).start();   // 开启线程        for (int i = 0; i < 10; i++) {            System.out.println(Thread.currentThread().getName() + "执行" + i);        }    }}

执行后果:

Thread-0执行0Thread-0执行1Thread-0执行2Thread-0执行3Thread-0执行4Thread-0执行5Thread-0执行6Thread-0执行7main执行0Thread-0执行8main执行1main执行2main执行3main执行4main执行5main执行6main执行7main执行8main执行9Thread-0执行9

4.继承Thread类和实现Runnable接口的区别

次要的区别有亮点:
1.因为java是单继承的机制,所以如果你抉择应用继承Thread类的形式实现多线程,则无奈再继承别的类实现对应的性能,而实现Runnable接口则不会有这样的问题。
2.继承Thread类不适宜资源共享,而实现Runnable接口则适宜实现资源共享,上面举个例子进行阐明。
继承Thread类:

class MyThread extends Thread {    private int count = 15;    private String name;    public MyThread(String name) {        this.name = name;    }    @Override    public void run() {        for (int i = 0;i < 5;i++){            System.out.println(name + "执行  " + count);            count--;        }    }}public class Main {    public static void main(String[] args) {        new MyThread("1").start();        new MyThread("2").start();    }}

执行后果:

1执行  152执行  152执行  141执行  142执行  131执行  132执行  121执行  122执行  111执行  11

实现Runnable接口:

class MyRunnable implements Runnable {    private int count = 15;    @Override    public void run() {        for (int i = 0; i < 5; i++) {        System.out.println(Thread.currentThread().getName() + "执行" + count);        count--;        }    }}public class Main {    public static void main(String[] args) {        MyRunnable myRunnable = new MyRunnable();        // 上面两个开始的线程都来于同一个线程类,因而类中的属性能够共享        new Thread(myRunnable, "3").start();        new Thread(myRunnable, "4").start(); }}

执行后果:

3执行154执行153执行143执行123执行113执行104执行134执行84执行74执行6

从执行的后果就能够看出应用实现Runnable接口的办法能够是的多个线程共享同一个资源变得可能,因而在资源共享性上更胜一筹。