Javaマルチスレッド、RunnableとThreadの詳細


並列と同時、すなわち類似で区別がある(ミクロ概念)
パラレル:2つ以上のイベントが同じ時点で発生することを指します.
同時:2つ以上のイベントが同じ期間に発生することを意味します.(シングルコアCPUシステムの場合)
 
スレッド同期と非同期の違い:
≪同期化|Synchronize|emdw≫:前のスレッドが実行されるのを待ってから現在のスレッドが実行され、データが同時に操作される場合、データを保護する必要があります.この保護はスレッド同期化です.
非同期:次のスレッドが実行されるのを待つ必要がなく、実行を開始するスレッドを指します.この2つのスレッドは関係なく、それぞれを行うことができます.
 
マルチプロセスとマルチスレッド:
マルチプロセス:オペレーティングシステムで複数のプログラムを同時に実行します.
マルチスレッド:同じプロセスで複数のタスクを同時に実行します.
 
プロセスとスレッドの違い:
プロセス:独立したメモリスペースがあり、プロセス内のデータ格納スペース(スタックスペースとスタックスペース)は独立しており、少なくとも1つのスレッドがあります.
スレッド:スタックスペースは共有され、スタックスペースは独立しており、スレッドが消費するリソースもプロセスより小さく、相互に影響を与えることができ、軽量プロセスまたはプロセス無とも呼ばれます.
Javaプログラムのプロセスには、少なくともプライマリスレッドとゴミ回収スレッド(バックグラウンドスレッド)が含まれています.
1つのプロセス内の複数のスレッドが同時実行されるため、ミクロの観点からも前後の順序があり、どのスレッドが実行されるかはCPUスケジューラ(JVMがスケジューリングする)プログラマーによって完全に制御できない.
 
スレッドのスケジュール:
コンピュータは通常、CPUが1つしかない場合、任意の時点で1つのコンピュータ命令しか実行できず、各プロセスはCPUの使用権を取得してこそ命令を実行することができる.マルチプロセス同時実行とは,マクロ的には各プロセスが交代でCPUの使用権を獲得し,それぞれのタスクを実行することである.では、実行可能プールでは、複数のスレッドが準備完了状態でCPUを待機し、JVMがスレッドのスケジューリングを担当します.
JVMはプリエンプトスケジューリングを採用しており、タイムシェアリングスケジューリングを採用していないため、マルチスレッド実行結果のランダム性をもたらす.
 
マルチスレッドのメリット:
マルチスレッドは、マルチタスク、同時動作の1つとして、もちろんメリットがあります.
1)プロセス間ではメモリを共有できないが、スレッド間ではメモリ(スタックメモリ)を共有できる.
2)システムがプロセスを作成する時、そのプロセスにシステム資源を再配分する必要がある.スレッドの作成にはコストがかかるため、マルチタスクの同時実行を実現すると、マルチスレッドの効率が向上します.
3)Java言語自体にマルチスレッド機能のサポートが内蔵されており,単純に下位システムとしてのスケジューリング方式ではなく,マルチスレッドが簡略化されている.
 
Java操作プロセス:
Javaでプロセスを実行する方法:
方式1:Runtimeクラスのexec()メソッド;
       Runtime runtime =Runtime.getRuntime();
       runtime.exec(“notepad”);
方式2:ProcessBuilderクラスのstart()メソッド;
       ProcessBuilder pd = newProcessBuilder(“notepad”);
       pd. start();
 
スレッドの作成と起動:
方式1:Threadクラスを継承する
手順:
1.クラスAがjavaに継承することを定義する.lang.Threadクラス;
2.AクラスでThreadクラスのrunメソッドを上書きする.
3、我々はrun方法の中で実行する必要がある操作àrun方法の中の、スレッド実行体を編纂する.
4、mianメソッド(スレッド)で、スレッドオブジェクトを作成し、スレッドを開始します.
スレッドクラスの作成:Aクラスa=new Aクラス()
スレッドオブジェクトを呼び出すstart()メソッド:a.start();//スレッドを開始
コードの実装:
// 
class MusicThread extends Thread{
	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			System.out.println(" " + i);
		}
	}
}

// 1: Thread 
public class ExtendsThreadDemo {
	public static void main(String[] args) {
		// : 
		for (int i = 0; i < 50; i++) {
			System.out.println(" "+i);
			if(i==10){
				// , 
				MusicThread music = new MusicThread();
				music.start();// , run 
			}
		}
	}
}

方式2:Runnableインタフェースを実現する
1、Javaに実装Aクラスを定義する.lang.Runnableインタフェース、Aクラスはスレッドクラスではないことに注意してください.
2.AクラスでRunnableインタフェースのrunメソッドを上書きする.
3、我々はrun方法の中で実行する必要がある操作àrun方法の中の、スレッド実行体を編纂する.
4、mainメソッド(スレッド)で、スレッドオブジェクトを作成し、スレッドを起動します.
スレッドクラスオブジェクトの作成:Thread t=new Thread(newA()
プログラミングオブジェクトを呼び出すstart()メソッド:t.start()
コードの実装:
 
// 
class MusicRunnableImpl implements java.lang.Runnable{

	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			System.out.println(" "+i);
		}
	}
	
}
// 2: Runnable 
public class ImplementsRunnableDemo {
	public static void main(String[] args) {
		// : 
		for (int i = 0; i < 50; i++) {
			System.out.println(" "+i);
			if(i==10){
				// , 
				Runnable target = new MusicRunnableImpl();
				Thread thread = new Thread(target);
				thread.start();
			}
		}

	}
}

匿名の内部クラスを使用してスレッドを作成します.
クラスが1回しか使用されない場合にのみ適用されます.
// 
// 
public class AnonymousInnerClassDemo {
	// 1
	public static void main(String[] args) {
		//  : 
		for (int i = 0; i < 50; i++) {
			System.out.println(" " + i);
			if (i == 10) {
				//  , 
				new Thread(new Runnable() {
					@Override
					public void run() {
						for (int i = 0; i < 50; i++) {
							System.out.println(" " + i);
						}
					}
				}).start();
			}
		}
	}

	// 2
	private static void test1() {
		//  : 
		for (int i = 0; i < 50; i++) {
			System.out.println(" " + i);
			if (i == 10) {
				//  , 
				new Thread() {
					@Override
					public void run() {
						for (int i = 0; i < 50; i++) {
							System.out.println(" " + i);
						}
					}
				}.start();
			}
		}
	}
}

継承と実装の選択:
継承方法:(Threadクラスを継承)
1)Javaではクラスは単一継承であり,Threadクラスを継承した場合,そのクラスには他の直接親クラスは存在しない.
2)操作から分析すると,継承方式がより簡単で,スレッド名の取得も簡単である.(操作はもっと簡単)
3)マルチスレッド共有同一リソースから解析すると,継承方式ができない.
実装方法:(Runnableインタフェースの実装)
1)Java中のクラスはインタフェースを多く実現することができ、この時、このクラスは他のクラスを継承することができ、また他のインタフェースを実現することができる.
2)操作上の分析から、実現方式の操作はもっと複雑で、Threadを使用しなければならない.現在のスレッドの参照を取得するためにcurrentThread()
3)マルチスレッド共有同一リソースから分析し,実現方式を実現できる.(同じリソースを共有するかどうか)