java多线程之线程创建方式


       笔者从今天开始学习java多线程,从入门到放弃。今天我们先记录java多线程的创建方式。java多线程的创建方式,可以分为四类。继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用java提供的Executors工具获取线程池对象,从中获取线程。

1、继承Thread类创建线程
      Thread本身实现了runnable接口,代表一个线程的实例。继承Thread类需要重写父类的run方法。调用本身的start方法来开启一个线程。start方法底层会调用run方法。这边我写了ExtendThread类来继承Thread类,重写run方法。这样子ExtendThread就是一个线程类了。接着在测试类中调用start开启一个线程。

java多线程之线程创建方式_第1张图片

                                                                                                                        ExtendThread类

                                                                                                                               开启线程
2、实现Runnable接口
实现Runnable会比继承Thread类来得更灵活,因java机制不允许类有多继承性,只允许实现多个接口。所以相对于继承Thread我还是推荐使用这个。这边我写了ImplRunnable来实现Runnable接口。通过Thread构造函数传入Runnable实现对象进去。Thread通过静态代理方式(通俗一点讲就是代理对象包装目标对象,代理对象帮忙调用目标对象的方法,局限性很大。现在比较流行动态代理),会去调用ImplRunnable的run方法。
如下:
java多线程之线程创建方式_第2张图片
                                                                                                                      实现Runnable接口

java多线程之线程创建方式_第3张图片

开启线程

     这里的target,就是Runnable 的实现类也就是我们这里的ImplRunnable类

java多线程之线程创建方式_第4张图片

 


3、实现Callable接口通过FutureTask包装器来创建Thread线程
        有时候我们需要检测当前线程的执行情况,并根据情况对其进行停止,这时候就可以通过包装器FutureTask来解决这个问题。首先我们创建ImplCallable类实现Callable接口传入一个返回值类型String。重写call方法,返回String类型的结果。后面通过包装器可以获取该结果

java多线程之线程创建方式_第5张图片

                                                                                ImplCallable类实现了Callable接口

        这里我们来看下FutureTask包装器的结构图:FutureTask间接实现了Runnable和Future接口,可以对Runnabl进行包装。进行监测等功能扩展。

java多线程之线程创建方式_第6张图片

                                                                                         FutureTask包装器的结构图
                       
       调用FutureTask对Callable实现类进行包装。FutureTask能够对当前这个线程进行监测,比如futureTask.cancel取消线程任务,futureTask.get获取线程返回的结果,此结果就是刚刚我们重写call方法里面的返回值,调用get方法线程会进入阻塞状态 。futureTask.isDone()可以判断当前线程是否执行完成。


4.通过线程池来创建线程。
        从上面来看,我们想要一个线程就去创建一个线程,这也实现起来很方便,可是事实上,如果并发数线程变多了,并且每个线程执行时间比较短,这样就会频繁的去创建线程资源就会大大降低了系统的性能。通常,我们可以用线程池来解决这个问题,首先,在服务启动的时候,我们可以启动好几个线程,并用一个容器(如线程池)来管理这些线程。
        java提供了Executors工具来给开发者创建不同类型的线程池,这里我们简单讲newFixedThreadPool这个方法。(后续我们会深入学习线程池的实现原理。)newFixedThreadPool方法创建了固定容量的线程池这里我初始化10个。

java多线程之线程创建方式_第7张图片


       调用execute执行某个线程,传入Runnable的实现类。(笔者现在也是刚接触线程池不久,不能够深入去记录一些东西。后续会不断的累计并分析给大家。)
ps:这边比较了几种创建线程的方式。

java多线程之线程创建方式_第8张图片

 


 

你可能感兴趣的:(java,多线程创建)