学習をマルチスレッド、コメントを追加しました:ようにインターフェイスとの間の関係を

まず、概念の理解

1、プロセスおよびスレッド

  • プロセスは、オペレーティングシステムレベルの概念です。
    • システムは、複数のプロセスを有していてもよいです。
  • スレッドは、分裂の過程の概念です。
    • プロセスは、複数のスレッドに分割することができます。

図2に示すように、プロセッサ:マルチコアの数:

  • ある時点でプロセッサは、常に一つのスレッドだけです!マルチコアプロセッサなら。
    • あなたは、マルチコアスレッドの効率を向上させることができますが、ないマルチコアが複数のスレッドを同時に実行します。
  • 同時に複数のスレッドを実行する複数のプロセッサ。

マルチスレッドの第二に、使用:、RunnableインタフェースとThreadクラス

2.1、、Runnableインタフェース

上:

  • Runnableを型関数は、関数(JAVA 8つの新機能)です。
  • これは、インターフェイスです。
  • これは、run()メソッドを定義します。public abstract void run();

公式文書:Runnableを(JavaプラットフォームSE 8)

2.2、Threadクラス

注意:Threadクラスは、Runnableインタフェースを実装しています。

具体的な学習の多くの非常に複雑なのクラス、およびフォローアップ分析を見てください。

2.3マルチスレッド

2.3.1方法1:Runnableを実装

手順を使用します

  1. クラスA、Runnableを実装します。このクラスは、スレッドは、コンテンツの実現である、run()メソッドをオーバーライドする必要があります。
  2. クラスはオブジェクトA-1を作成します。
  3. -1 T-1を取得するスレッドクラスのコンストラクタスレッドクラス・オブジェクトへのオブジェクト参照として。
  4. T-1の実行オブジェクトのstart()メソッドは、スレッドを開始します。
  5. 終了

2.3.2第二の方法:継承Threadクラス

手順を使用します

  1. クラスT、クラスの継承スレッド。このクラスは、スレッドは、コンテンツの実現である、run()メソッドをオーバーライドする必要があります。
  2. オブジェクト・クラスT T-1を作成します。
  3. T-1の実行オブジェクトのstart()メソッドは、スレッドを開始します。
  4. 終了

2.3.3ステップの違いの2種類:

その中で、さらに一歩簡単な類推を達成するために、Runnableインタフェースの継承スレッド

  • Threadクラスの継承は、直接run()メソッドがオブジェクトに与えられて実装します。
  • しかしながら、対象物に付与するの対応するコンストラクタ()メソッドによってRunnable実行を実装する必要があります。

特定のコードの実装は、オリジナルを見ることができます:Javaのマルチスレッドは、(a)は、Javaのマルチスレッドのエントリを学ぶ-デンバー

第三に、様々なインターフェイスとの間の関係

インターフェイスとの関係:

  • 呼び出し可能とRunnableをインタフェースインタフェース
    • 呼び出し可能インターフェースは、汎用インターフェースは、()関数は、渡された型は型V.で返している唯一の()メソッドの呼び出しを、持っています
    • 、Runnableインタフェースのみrun()メソッド。
    • 有意な関係はありませんでした。
  • 呼び出し可能と将来のインタフェースインタフェース
    • 上記のように、両者の間に有意な関係ありません
  • エグゼキュータと、Runnableインタフェース
    • 図、エグゼキュータだけのRunnable関係として。参考に()メソッドが実行可能である実行します。
    • 呼び出し可能と今後のエグゼキュータと有意な関係はありません。
  • ExecutorServiceのインタフェース
    • これは非常に不思議なインターフェイスです
      • まず、それは執行から継承された:、Runnableインタフェース手段との関係を
    • これは、Runnableをの提出()メソッドを呼び出し可能と未来の組み合わせによってです
      • 実行可能な基準方法、将来のように呼び出し可能とは、結果を返します。
    • これは、()メソッドと今後の呼び出し可能に結合し、リストのすべての種類によってinvokeAllすることです。
    • invokeAny()メソッドは、まだ使用を見つけることができます。

他の4つの関係:

そして、4.1 FutureTaskとの関係の未来

关系如下图,FutureTask 实现了 Future 接口和 Runnable 接口。其他就是FutureTask 自己的方法,自己的实现逻辑。
注意:FutureTask 是 Future 接口的一个唯一实现类。

我们重点看下FutureTask 的调用逻辑:(其他复杂实现暂时不管。)

  1. 执行线程并且得到返回结果
    • run() 方法负责线程调用,内部实际调用的是 Callable 接口。
      • 得到调用结果后调用自己的 set() 方法
      • set() 方法:将线程结果设置为自己的一个属性:outcome
  2. 取出线程结果:
    • get() 方法内部实际调用自己的 report() 方法,并返回 report() 方法的返回结果;
    • report() 方法:从自身的 outcome 属性取值并返回。

上述就是对于 FutureTask 的具使用逻辑

4.2 Executors 和 ScheduledThreadPoolExecutor、ThreadPoolExecutor、Executor

4.2.1 Executors 和其他的关系 :

  • 从依赖关系上康,Executors和其他接口和类没什么关系。

Executors 到底是做什么的?

Executors是一个工具类,类似StringUtils等的封装。用于提供一些常用的线程池。一般网上都是说提供四种线程池:

  • newCachedThreadPool:(实现是:ThreadPoolExecutor)
  • newFixedThreadPool:(实现是:ThreadPoolExecutor)
  • newScheduledThreadPool:(实现是:ScheduledThreadPoolExecutor)
  • newSingleThreadExecutor:(实现是:ThreadPoolExecutor)

但实际上,Executors 的方法不止这些,还有很多其他方法。不知道为什么网上这样说。
可以看到,底层实现几乎都是ThreadPoolExecutor。那么为什么不直接使用ThreadPoolExecutor呢?因为 java doc 中不提倡直接用。

4.2.2 其他:ScheduledThreadPoolExecutor、ThreadPoolExecutor、Executor之间的关系:

  • 首先区分接口和实现类:
    • 接口:Executor、ExecutorService、ScheduledExecutorService
    • 实现类:AbstractExecutorService、ThreadPoolExecutor、ScheduledThreadPoolExecutor
  • 然后对实现类再做区分
    • AbstractExecutorService 是线程池对象的抽象类(抽象类不能实例化)。
    • ThreadPoolExecutor、ScheduledThreadPoolExecutor可以看作是 AbstractExecutorService 的子类。

五、参考:

  1. Java 多线程学习(一)Java 多线程入门 - 掘金
    注:开始部分对于线程、进程和处理器的概念说明很棒。
  2. Future 解析与使用 - 林老师带你学编程 - CSDN 博客
    Callable 与 Runnable的关系说的很好,还有Future 和 Callable 的关系,还有ExecutorService 的关系
  3. Java Executors 和 ThreadPoolExecutor 线程池 - xlxxcc 的专栏 - CSDN 博客
    注:说明了 Executors 和 ThreadPoolExecutor 线程池的关系。
  4. Java 并发编程:线程池的使用 - Matrix 海子 - 博客园
    注:ThreadPoolExecutor 详解。

おすすめ

転載: www.cnblogs.com/buwuliao/p/11579861.html