实现多线程的三种方法:Thread、Runnable和Callable

  • 继承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对象表示异步计算的结果,它提供了检查计算是否完成的方法。

posted on 2017-03-17 12:21  一个不会coding的girl  阅读(467)  评论(0编辑  收藏  举报

导航