java多线程执行的两种方式:
1、继承Thread类,并覆盖其run方法;
2、实现Runnable接口,并实现其run方法;
第一种方式:
public class TestThread1 extends Thread {
@Override
public void run() {
System.out.println("TestThread name :" + this.getName() + " start");
}
public static void main(String[] args) {
Thread t1 = new TestThread1();
Thread t2 = new TestThread1();
Thread t3 = new TestThread1();
t1.start();
t2.start();
t3.start();
}
}
Thread类的本质是实现了Runnable接口的一个实例,因此也就是一个线程实例;启动线程的唯一方式就是通过Thread.start();方法启动(单线程,不包括线程池);由于jvm是运行在操作系统之上的假象计算机,且java线程与操作系统原生线程具有直接映射关系,因此start方法是一个native方法,它将启动一个新线程实例,并调用run方法。
执行结果:
TestThread name :Thread-0 start
TestThread name :Thread-1 start
TestThread name :Thread-2 start
第二种方式:如果我们的类已经继承了父类又想实现多线程怎么办呢?此时应该实现Runnable接口,并实现其run方法:
public class TestThread2 implements Runnable {
@Override
public void run() {
System.out.println("TestThread2 name " + Thread.currentThread().getName() + " start");
}
public static void main(String[] args) {
/**
* 这里相当于未开启多线程,而是普通的方式直接执行了run方法
*/
new TestThread2().run();
/**
* 调用start方法使线程处于就绪状态,等待cpu时间分片,真正的多线程启动
*/
Thread thread1 = new Thread(new TestThread2());
thread1.start();
Thread thread2 = new Thread(new TestThread2());
thread2.start();
Thread thread3 = new Thread(new TestThread2());
thread3.start();
}
}
注意:new TestThread2().run();方法并未开启多线程,只是以主线程的实例执行了普通的方法调用,单线程的启动的唯一方式就是调用Thread.start()方法,因此下面还需要创建Thread的实例,将TestThread2的实例传入,执行start方法就会自动调用实现了Runnable接口的TestThread2实例的run方法。
执行结果:
TestThread2 name main start
TestThread2 name Thread-0 start
TestThread2 name Thread-1 start
TestThread2 name Thread-2 start