並行並列
並行性は、2つの以上のイベント同じ期間Aにおいて生じることをいいます。
並列の2つの以上のイベントを指しが同時に発生した(同時に)
オペレーティング・システムにおいて、複数のプログラムのインストールは、同時に時間の期間を意味する複数のプログラムは、マクロで実行されている、単一CPUシステム、毎回一つだけプログラムの実行、微視的すなわちプログラム時間が交互に実行され、ジャスト実行時間インターリーブ時間が非常に短い実行されているため、同時に、それは、およびマルチCPUシステムでは、これらのプログラムを同時に実行することができますが、割り当てることができるという印象を与えますプログラムを処理するために、各プロセッサとタスク、すなわちの複数のプロセッサ(CPU)と、多並列実行、複数のプログラムを同時に実行することができるように、同時に実行することができます。彼は、現在のコンピュータ市場のマルチコアCPUは、マルチコアプロセッサは、複数のコアであり、前記、複数の並列処理プログラム、大幅にコンピュータ操作の効率を向上させることができます。
スレッドのスケジューリング
シングルコアプロセッサのコンピュータは確かに並行して複数のタスクを扱うことができない、複数のタスクは、単一のCPU上で同時に実行することができます。同様に、スレッドは、スレッドが並列に実行されて理解するビューのマクロ点から、同じであるが、微視的観点から分析はそれがシリアル動作、システムは、1つのCPUだけであるときに実行するスレッドであるスレッド、スレッドです特定の順序で複数のスレッドを実行し、我々はこのような状況は、スレッドのスケジューリングと呼ばれる呼び出します。
カテゴリー:
タイムシェアリングのスケジューリング:すべてのスレッドは、各スレッドCPU割り当て、CPUを使用した平均時間を交代で使用する権利。
プリエンプティブスケジューリング:同一のスレッドの優先順位は、次にランダムに(スレッドランダム)を選択する場合はプリエンプティブなスケジューリングのJavaを使用するため、優先度の高いスレッドがCPUを優先
詳細プリエンプティブスケジューリング
ほとんどのオペレーティングシステムは、実行中の複数の並行プロセスをサポートし、現在ではほとんどすべてのオペレーティングシステムを同時に実行する複数のプログラムをサポートしています。例:エディタを使用している間、画面の使用は、ソフトウェアを記録しながらも、製図板、ドスの窓やその他のソフトウェアを駆動しながら、今、私たちは、クラスです。この時点で、これらのプログラムは、「私は、同時に実行されているソフトウェアのように感じる。」、同時に実行されています 複数のスレッド間の高速スイッチングを用いて実際に、CPU(中央処理装置)プリエンプティブスケジューリングモード。コアCPUが関係しているために、いくつかの点で、あなただけの1つのスレッドを実行することができ、かつ複数のスレッド間の切り替えCPUの速度は、私たちは同じ時間実行時のように見え、比較的速く感じます。実際には、マルチスレッド化されたプログラムは、プログラムの動作速度を改善しませんが、プログラムがそのCPU使用率が高いことを、業務効率を向上させることができます。
スレッドとプロセス
プロセス:各プロセスは、別々のメモリ空間を有している、アプリケーションは同時に複数のプロセスを実行することができ、メモリ内で実行中のアプリケーションを指し、プロセスの実行はプログラムであり、プログラムを実行すると、システムの基本的な単位であるシステムプロセスの終焉に実行するプロセスから作成されたプログラムを、実行します。
スレッド:スレッドは、現在のプロセス内のプログラムの実行を担当する処理実行部と、に少なくとも1つのスレッドのプロセスです。プロセスは複数のスレッドを持つことができ、アプリケーションは、マルチスレッドプログラムを呼び出すことができます。
要するに:少なくとも一つのプロセスのプログラムを実行した後があり、プロセスが複数のスレッドを含めることができます
スレッドクラスを作成します。
Javaはjava.lang.Threadのクラスがスレッドを表し、すべてのスレッドオブジェクトは、Threadクラスまたはサブクラスのインスタンスでなければなりません使用しています。各スレッドの役割は、特定のタスクが実際に実行のための期間であり、プログラムのコードストリームを実行して完了することにあります。Javaは、このプログラムの流れを表現するために、実行のスレッドを使用しています。次のようにするJavaのステップと継承Threadクラスを通じて、マルチスレッド作成を開始です。
1.スレッドサブクラス、クラスおよびオーバーライドrun()メソッドを定義し、メソッド本体のrun()メソッドは、タスクを完了するために、スレッドのニーズを表し、したがって、run()メソッドは、スレッドの実行と呼ばれています。
スレッドのサブクラスのインスタンスを作成します。2.、スレッドオブジェクトが作成されます
3.スレッドを開始するスレッドオブジェクトのstart()メソッドを呼び出します
1 package demosummary.thread;
2
3 public class MyThread extends Thread {
4 //定义线程名称的构造方法
5 public MyThread(String name) {
6 super(name);
7 }
8 //重写run方法
9 @Override
10 public void run() {
11 for (int i = 0; i < 5; i++) {
12 System.out.println(getName() + ":正在执行第" + i + "线程");
13 }
14 }
15
16 public static void main(String[] args) {
17 //创建线程对象
18 MyThread myThread = new MyThread("新的线程");
19 //开启线程
20 myThread.start();
21 //执行for循环
22 for (int i = 0; i < 5; i++) {
23 System.out.println("正在执行主线程:"+i);
24 }
25 }
26 }
多线程原理
1 package demosummary.thread;
2
3 public class MyThread extends Thread {
4 //定义线程名称的构造方法
5 public MyThread(String name) {
6 super(name);
7 }
8 //重写run方法
9 @Override
10 public void run() {
11 for (int i = 0; i < 5; i++) {
12 System.out.println(getName() + ":正在执行第" + i + "线程");
13 }
14 }
15
16 public static void main(String[] args) {
17 System.out.println("这里是main线程");
18 //创建线程对象
19 MyThread myThread = new MyThread("小强");
20 //开启线程
21 myThread.start();
22 //执行for循环
23 for (int i = 0; i < 5; i++) {
24 System.out.println("旺财:"+i);
25 }
26 }
27 }
程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。随着调用mt的对象的 start方法,另外一个新的线程也启动了,这样,整个应用就在多线程下运行,多线程执行时,在栈内存中,其实每一个执行线程都有一片自己所属的栈内存空间。进行方法的压栈和弹栈
Thread类
构造方法
public Thread() :分配一个新的线程对象。
public Thread(String name) :分配一个指定名字的新的线程对象。
public Thread(Runnable target) :分配一个带有指定目标新的线程对象。
public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字。
常用方法
public String getName() :获取当前线程名称。
public void start() :导致此线程开始执行; Java虚拟机调用此线程的run方法。
public void run() :此线程要执行的任务在此处定义代码。
public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
public static Thread currentThread() :返回对当前正在执行的线程对象的引用。
创建线程方式有两种,一种是继承Thread类方式,一种是实现Runnable接口方式
创建线程(实现Runnable接口)
采用 java.lang.Runnable 也是非常常见的一种,我们只需要重写run方法即可
方法:
1. 定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
2. 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正 的线程对象。
3. 调用线程对象的start()方法来启动线程。
1 package demosummary.thread;
2
3 public class MyRunnable implements Runnable {
4 //重写run方法
5 @Override
6 public void run() {
7 for (int i = 0; i < 5; i++) {
8 System.out.println(Thread.currentThread().getName() + "---" + i);
9 }
10 }
11
12 public static void main(String[] args) {
13 //创建类任务对象
14 MyRunnable myRunnable = new MyRunnable();
15 //创建线程
16 Thread thread = new Thread(myRunnable, "德玛");
17 //开启线程
18 thread.start();
19 for (int i = 0; i < 5; i++) {
20 System.out.println("皇子" + "---" + i);
21 }
22 }
23 }
通过实现Runnable接口,使得该类有了多线程类的特征。run()方法是多线程程序的一个执行目标。所有的多线程 代码都在run方法里面。Thread类实际上也是实现了Runnable接口的类。 在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target) 构造出对象,然后调用Thread 对象的start()方法来运行多线程代码。
实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是继承Thread类还是实现 Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程 编程的基础
注意:Runnable对象仅仅作为Thread对象的target,Runnable实现类里包含的run()方法仅作为线程执行体。 而实际的线程对象依然是Thread实例,只是该Thread线程负责执行其target的run()方法
Thread和Runnable的区别
实现Runnable接口比继承Thread类所具有的优势:
1. 适合多个相同的程序代码的线程去共享同一个资源。
2. 可以避免java中的单继承的局限性。
3. 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
4. 线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。
注意:在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用 java命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM其实在就是在操作系统中启动了一个进程
匿名内部类方式实现线程的创建
使用线程的内匿名内部类方式,可以方便的实现每个线程执行不同的线程任务操作
1 package demosummary.thread;
2
3 public class InnerClassThread {
4 public static void main(String[] args) {
5 MyRunnable myRunnable = new MyRunnable(){
6 public void run(){
7 for (int i = 1; i <= 5; i++) {
8 System.out.println("德玛---"+i);
9 }
10 }
11 };
12 new Thread(myRunnable).start();
13 }
14 }