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{
@Override
public 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(){
@Override
public 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 {
@Override
public 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() {
@Override
public 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() {
@Override
public 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分配时间碎片