1、通过继承Thread类来实现
class="java">class MyThread extends Thread { public void run() { System.out.println("当前" + Thread.currentThread().getName() + "正在执行任务"); } } public class Test { public static void main(String[] args) { Thread t1 = new MyThread(); t1.setName("A线程"); t1.start(); Thread t2 = new MyThread(); t2.setName("B线程"); t2.start(); } }
运行结果: 当前B线程正在执行任务 当前A线程正在执行任务
? 注意:多次运行你会发现显示的结果每次都会有变动而且和我们预测的结果不一样,这是由于CPU在执行时,分配任务一般属于抢占式,那个线程先抢到先执行。如果让看到的现象更直观,可以在run方法使用循环
public class Test2 { public static void main(String[] args) { Runnable r = new MyThread2(); Thread t1 = new Thread(r); t1.setName("A线程"); t1.start(); Thread t2 = new Thread(r); t2.setName("B线程"); t2.start(); } } class MyThread2 implements Runnable { public void run() { System.out.println("当前" + Thread.currentThread().getName() + "正在执行任务"); } }
?
程序运行结果:(每次都会变同上) 当前B线程正在执行任务 当前A线程正在执行任务
?3、通过上面两个小程序的运行结果发现,无论那种方式实现多线程,都要去重写run()方法,开启线程都是通过start()方法,执行start()方法后就会执行到run()方法,run方法就是线程执行任务的入口,但是要注意一点,调用了start()方法不一定就会立即去执行run方法,因为多线程运行时本身就是抢占式的,每个线程之间也有优先级等区别。感兴趣的同学可以去看下API文档,你会发现两者实质相似,Thread类也实现的 Runnable接口。
4、两种开启线程的比较
a)第一种开启线程代码要简洁些
b)通过接口开启线程可以避免单继承
c)通过接口开启线程可以实现多个线程共享一个资源
使用原则:能使用接口尽量使用接口
?