- 继承Thread类,重写run()方法
步骤: (1) 定义类继承Thread类
(2) 复写Thread类中的run方法。
(3) 调用线程的start方法
(start方法有两种含义:1. 启动多线程。2. 调用线程中的run方法)
public class MyThread{ public static void main(String args[]){ DemoThread dt = new DemoThread(); dt.start(); //用于启动线程,并自动执行run方法。 dt.run(); //只是单纯的对象调用,在主线程中执行,并不开启子线程。 for(int i=0;i<50;i++){ System.out.println("main run-----"+i); } } } class DemoThread extends Thread{ public void run(){ for(int i=0;i<50;i++) System.out.println("demo run-----"+i); } }
- 实现Runnable接口,并实现该接口的run()方法
步骤:(1) 创建类实现Runnable接口
(2) 实现Runnable接口中的run方法
(3) 创建Thread对象
(4) 将Runnable对象作为实际参数传递给Thread的构造方法
(5) 调用Thread类的start方法,自动执行Runnable对象中的run方法
1 public class MyRunable{ 2 public static void main(String args[]){ 3 DemoRunnable dr = new DemoRunnable(); 4 Thread t1 = new Thread(dr); 5 Thread t2 = new Thread(dr); 6 Thread t3 = new Thread(dr); 7 Thread t4 = new Thread(dr); 8 t1.start(); 9 t2.start(); 10 t3.start(); 11 t4.start(); 12 } 13 } 14 class DemoRunnable implements Runnable{ 15 private int ticket=100; 16 public void run(){ 17 while(true){ 18 if(ticket>0) 19 System.out.println(Thread.currentThread().getName()+"--售票:"+ticket--); 20 } 21 } 22 }
- 实现Callable接口,重写call()方法
Callable接口与Runnable接口的功能类似,但提供了比Runnable接口更强大的功能。
面试: 继承方式与实现方式有什么区别?
(1) 避免了单继承的局限性
(2) 多线程执行代码位置不同
继承Thread类:代码存放在Thread类的run方法中
实现Runnable类:代码存放在Runnable接口的run方法中。
面试:Callable与Runnable对比?
(1) Callable可以在任务结束后提供一个返回值,而Runnable无法提供这个功能
(2) Callable中的call()方法可以抛出异常,而Runnable中的run()方法不能抛出异常
(3) 运行Callable可以拿到一个Future对象,Future对象表示异步计算的结果,它提供了检查计算是否完成的方法。