Java并发编程:线程池的使用 (2)

可知最后:无论哪种方法都需要实现run()方法,run方法是线程的运行主体。并且,线程的运行都是调用Thread的start()方法。
那么代理模式中Thread类就充当了代理类,它在线程运行主体运行前作了一些操作然后才运行线程的run()。首先说一下代理模式的基本特征就是对【代理目标进行增强】代理模式就不在这里详述。总之,Thread提供了很多有关线程运行前、后的操作,然后通过它的start()方法让JVM自动调用目标的run()方法

第四:继承Thread与实现Runnable接口方法区别
首先看一段代码:

new Thread( new Runnable(){ public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) {e.printStackTrace(); } System.out.println("runnable :" + Thread.currentThread().getName()); } } } ){ public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) {e.printStackTrace();} System.out.println("thread :" + Thread.currentThread().getName()); } } }.start();

可以预测一下这段代码是执行哪一个run()方法?
根据以前java中基础知识可知:执行start()方法后,JVM去找run()方法,然后它找到了自己的run()方法,那么就直接运行自己的run()方法。如果找不到自己的方法它才会去找被代理的run()方法。所以它应该执行的是"thread:。。。"代码部分。可以把它放到一个main方法中,通过测试验证推断正确:

想说明的是一个面向对象的思想:即如果没有上方第二个run()块,那么它执行的就是匿名Runnable实现类的run()方法。这说明什么,说明,Thread相当于一个执行者,而执行的代码块在Runnable实现类中定义好。这样实现执行与源码的分离,体现了面向对象的思想。这也是他们之间的一个比较大的区别。

其他区别:

实现Runnable接口可以实现资源共享,Thread无法完成资源共享 ----- 讨论第三点的两段代码中:继承Thread的:结果卖出了15张,各有各的票数。实现Runnable接口的方法:卖出5张,共享了资源

实现Runnable接口比继承Thread类来实现多线程有如下明显优点:

适合多个相同程序代码使用共同资源;

避免由单继承局限带来的影响;

增强程序的健壮性,代码能够被多个线程共享,代码数据是独立的;

使用的选择
通过比对区别可知:
由于面向对象的思想,以及资源共享,代码健壮性等,一般都是使用实现Runnable接口来实现多线程,也比较推荐

Java并发编程:线程池的使用

文章的主题是基于下面的旧版的一些线程池的讲解,再加上1.8的情况与一些补充,下面为旧版原文链接,基本思想没变,仅进行一些对比解释

   

在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:

  如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。

  那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?

  在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起,然后再讲述它的实现原理,接着给出了它的使用示例,最后讨论了一下如何合理配置线程池的大小。

  以下是本文的目录大纲:

  一.Java中的ThreadPoolExecutor类

  二.深入剖析线程池实现原理

  三.使用示例

  四.如何合理配置线程池的大小 

  若有不正之处请多多谅解,并欢迎批评指正。

一.Java中的ThreadPoolExecutor类
  java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。下面我们来看一下ThreadPoolExecutor类的具体实现源码。

  在ThreadPoolExecutor类中提供了四个构造方法:

public class ThreadPoolExecutor extends AbstractExecutorService {

..... public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler); ... }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzzypj.html