• 牛客网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框架来创建,包含了很多并发处理以及线程池的方法。

  • 相关阅读:
    python+selenuim自动化测试(六)上传文件
    python+selenuim自动化测试(七)滚动条的操作
    python+selenuim自动化测试(三)鼠标的操作
    python+selenuim自动化测试(四)frame嵌套页面元素定位
    python+selenuim自动化测试(二)
    关于Django Specifying a namespace in include() without providing an app_name
    Xadmin 改造Django后台
    13-1 userprofile注册以及django的权限管理
    python-django开发(django2.0.9+xadmin0.6.1)填坑
    django xadmin 安装和使用
  • 原文地址:https://www.cnblogs.com/zlslch/p/7416855.html
Copyright © 2020-2023  润新知