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接口的办法能够是的多个线程共享同一个资源变得可能,因而在资源共享性上更胜一筹。