zoukankan      html  css  js  c++  java
  • Java 创建线程的方式

    想必大家在Java面试中经常会被问到有关线程的问题,最常见的莫过于“Java有哪几种创建线程的方式呢?”

    稍稍了解过,或者在日常开发中也都会用到以下几种方式:

    ①继承Thread类(真正意义上的线程类),是Runnable接口的实现。
    ②实现Runnable接口,并重写里面的run()方法。
    ③实现Callable接口,重写call()方法,有返回值。
    ④使用Executor框架创建线程池。Executor框架是juc(java.util.concurrent)包里提供的线程池的实现。

    但我这里想说的是,其实以上所有的创建线程的方式,其底层都是实现了Runnable接口。

    首先是Thread类(真正意义上的线程类):

    他实现了Runnable接口的run()方法,继承Thread类后,你可以重写run()方法实现线程要完成的功能;

    当然,Thread类中还定义大量用于线程转换的方法,这个可以见下图(侵删):

    PS:notify()、notifyAll()、wait()是Object类的方法

    然后是通过实现Runable接口 :

      实现Runnable接口的类需要再次用Thread类包装后才能调用start方法。(三个Thread对象包装一个类对象,就实现了资源共享)。

    再是实现Callable接口:

    实现Callable接口的类先需要用FutureTask类包装后,再Thread类包装FutureTask类后才能调用start()方法。(三个Thread对象包装一个FutureTask类对象,就实现了资源共享)。FutureTask包装类也是实现了Runnable的子接口RunnableFuture<V>。

    最后是使用Executor框架创建线程池:

    线程池就是限制系统中使用线程的数量以及更好的使用线程
    需要启线程的话,就从线程池里取一个。当使用完了,就“关闭”线程,这不是正在意义上的关闭,只是把线程放回到我们的池里,供其他人在使用。

    底层是Worker + workQueue(BlockingQueue<Runnable> )实现的

    Worker对象它实现了Runnable接口,你把它当成Runnable的一个代理类即可,最终也是执行它的run()方法。

       这篇博客对它的底层原理解释的很详细,大家可以参照着源码看 剖析ThreadPoolExecutor运行过程

  • 相关阅读:
    JavaWeb之Servlet的生命周期
    Java之HashMap和HashTable的区别
    Java之使用中间缓存变量机制
    哪项技术可以用在WEB开发中实现会话跟踪实现?
    Spring的简单定时任务的实现
    Java解决No enclosing instance of type PrintListFromTailToHead is accessible问题
    StringBuffer和StringBuilder的区别
    论文阅读笔记:《Generating Question-Answer Hierarchies》
    python学习笔记(十)——正则表达式和re模块
    Python学习笔记(九)——字符串
  • 原文地址:https://www.cnblogs.com/yucfeng/p/9726880.html
Copyright © 2011-2022 走看看