まず、概念の理解
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を実装
手順を使用します
- クラスA、Runnableを実装します。このクラスは、スレッドは、コンテンツの実現である、run()メソッドをオーバーライドする必要があります。
- クラスはオブジェクトA-1を作成します。
- -1 T-1を取得するスレッドクラスのコンストラクタスレッドクラス・オブジェクトへのオブジェクト参照として。
- T-1の実行オブジェクトのstart()メソッドは、スレッドを開始します。
- 終了
2.3.2第二の方法:継承Threadクラス
手順を使用します
- クラスT、クラスの継承スレッド。このクラスは、スレッドは、コンテンツの実現である、run()メソッドをオーバーライドする必要があります。
- オブジェクト・クラスT T-1を作成します。
- T-1の実行オブジェクトのstart()メソッドは、スレッドを開始します。
- 終了
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 的调用逻辑:(其他复杂实现暂时不管。)
- 执行线程并且得到返回结果
- run() 方法负责线程调用,内部实际调用的是 Callable 接口。
- 得到调用结果后调用自己的 set() 方法
- set() 方法:将线程结果设置为自己的一个属性:outcome
- run() 方法负责线程调用,内部实际调用的是 Callable 接口。
- 取出线程结果:
- 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 的子类。
五、参考:
- Java 多线程学习(一)Java 多线程入门 - 掘金
注:开始部分对于线程、进程和处理器的概念说明很棒。- Future 解析与使用 - 林老师带你学编程 - CSDN 博客
Callable 与 Runnable的关系说的很好,还有Future 和 Callable 的关系,还有ExecutorService 的关系- Java Executors 和 ThreadPoolExecutor 线程池 - xlxxcc 的专栏 - CSDN 博客
注:说明了 Executors 和 ThreadPoolExecutor 线程池的关系。- Java 并发编程:线程池的使用 - Matrix 海子 - 博客园
注:ThreadPoolExecutor 详解。