打赏

牛客网Java刷题知识点之四种不同的方式创建线程

 

 

  不多说,直接上干货!

 

 

有4种方式可以用来创建线程:
  第一种:继承Thread类,重写run方法
  第二种:实现Runnable接口,并实现该接口的run方法(一般我们在编程的时候推荐用这种)

  第三种:实现Callable接口,重写run方法
  第四种:应用程序可以使用Executor框架来创建线程池

  

 

 

 

 

 

第一种:继承Thread类,重写run方法,不带返回值

  继承Thread类(真正意义上的线程类),是Runnable接口的实现。

class  MyThread extends Thread
    public void run() { 
        System.out.println("Thread body");//线程的函数体
     }

public class Test
    public static void main(String ] args) { 
        MyThread  thread = new MyThread ();
    
thread.start();//开启线程
  } 
}

  

 

 

 

 

 


第二种:实现Runnable接口,实现run方法,不带返回值

  但是比继承Thread类好用,实现接口还可以继承类,避免了单继承带来的局限性;

  一般情况下,常见的是这种。

    Runnable接口有如下好处:

    ①避免点继承的局限,一个类可以继承多个接口。

    ②适合于资源的共享

 

  实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。

  主要步骤如下:

    (1)自定义类并实现Runnable接口,实现run方法。

    (2)创建Thread对象,用实现Runnable接口的对象作为参数实例化该Thread对象。

     (3)调用Thread的start方法。


class  MyThread implements Runable {  //创建线程类
       public void run() {   
            System.out.println("Thread body");
        }
}


public  class Test { 
      public static  void main(String ]  args) { 
            MyThread   thread   =  new  MyThread();
            Thread t = new Thread(thread);
            t.start(); //开启线程
       }
}

 

 

 

 

 

 

 

 


第三种:实现callable接口,重写call方法,带返回值

  可以获取返回值,缺点是比较繁琐。

  Callable接口实际是属于Executor框架中的功能类,Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能。主要如下:

  (1)Callable可以在任务结束后提供一个返回值,而Runnable无法提供这个功能。

  (2)Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常。

  (3)运行Callable可以拿到一个Future对象,Future对象表示异步计算的结果,它提供了检查计算是否完成的方法。由于线程属于异步计算模型,因此无法从别的线程中得到函数的返回值,在这种情况下,就可以使用Future来监视目标线程调用call()方法的情况。当调用Future的get()方法以获取结果时,当前线程就会阻塞,指导call()方法结束返回结果。

import  Java.util.concurrent.*;
   
public  class CallableAndFuture {   //创建线程类
        public  static  class CallableTest implements  Callable <String> { 
            public  String call()  throws Exception { 
                return  "Hello World!";
            }
        }

    
    public static void main(String ] args) { 
        ExecutorService threadPool = Executors.newSingleThreadExecutor();//启动线程
        Future<String>  future  =  threadPool.submit(new  CallableTest());
        try { 
            System.out.println("waiting thread to finish");
            System.out.println(future.get());//等待线程结束,并获取返回结果
        } catch (Exception e) { 
                e.printStackTrace();
        }
  }
}

 

 

 

 

 


第四种:使用实现了Executor接口的ThreadPoolExecutor来创建线程池

  用Executor框架来创建,包含了很多并发处理以及线程池的方法。

 

posted @ 2017-08-23 10:27  大数据和AI躺过的坑  阅读(531)  评论(0编辑  收藏  举报