1、继承Thread
- 自定义类继承Thread,重写run()方法
main方法中start
public class Main {public static void main(String[] args) {MyThread t1 = new MyThread();t1.start();MyThread t2 = new MyThread();t2.start();}static class MyThread extends Thread{@Overridepublic void run() {super.run();System.out.println(Thread.currentThread().getName()+": start");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+": end");}}}
匿名内部类
new Thread(){@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+": start");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+": end");}}.start();
2、实现Runnable
自定义类实现Runnable接口,重写run()方法
主线程中实例化该类,再把实例传给一个Thread
public class Main {public static void main(String[] args) {MyRunnable r1 = new MyRunnable();Thread t1 = new Thread(r1);t1.start();MyRunnable r2 = new MyRunnable();Thread t2 = new Thread(r2);t2.start();}static class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+": start");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+": end");}}}
匿名内部类
public class Main {public static void main(String[] args) {Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+": start");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+": end");}});t1.start();Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+": start");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+": end");}});t2.start();}}
3、两种方法的区别
继承Thread
- 一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了
- 但是一个类只能继承一个父类,这是此方法的局限
- 一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了
- 实现Runnable
- 程序开发中以实现Runnable接口为主
- 避免单继承的局限,一个类可以实现多个接口
- 适合于资源的共享
- 程序开发中以实现Runnable接口为主
- start和直接run的区别
- start方法开始线程,处于就绪状态,等待CPU分配时间碎片
- 直接调用run方法就是一个普通方法的调用
- start方法开始线程,处于就绪状态,等待CPU分配时间碎片
