Javaのマルチスレッドプログラミングのシニア00 00Java

1つのプロセスとスレッド

あなたはマルチスレッド包括的かつ詳細な理解の概念を持つことができない場合は最大の特徴の中で、全体のJavaテクノロジの内部を学ぶので、マルチスレッド開発のためのJava言語サポート(マルチスレッドのプログラミング言語をサポートするために、いくつかの1)であります設計プロセスの将来に行われたプロジェクトの中で、特に同時アクセスのデザインは深刻な技術的な欠陥となります。

お使いのコンピュータ上でウイルスに現れた場合、すべてのプログラムは、伝統的なDOSので、実行されません:あなたは、スレッドが首相自身が機能を持っている伝統的なDOSシステムの時代に、プロセスの概念を理解する必要があるということであるかを知りたい場合は治療の過程の単一の最も重要な特徴は、同じ期間にのみ実行中のプログラムを可能にしながら、単一のプロセスの処理を使用しました。

それはあなたが時間の期間に同時に複数のプログラムを実行することができることを意味し、これらのプログラムがリソースをつかむためになりますので、順序で同じ時間帯に複数のプログラムが存在しますので、その後、Windowsの時代には、マルチプロセス設計を開始しましたプロセスのない量がありますが、また、シングルコアCPUの処理速度よりも多く持つことができ、発生していない場合でも、CPUは、その後、より処理できるため、実行が、同じ時点でのみ、プロセス実行、および後でさらにマルチコアCPUがあるだろうアップグレードしてください。

スレッドは、スレッドは、プロセスに基づいて作成されて使用される、分裂のプロセスに基づいて小さなプログラム単位であるため、スレッドは、プロセスの支援に依存するが、起動速度がはるかに速いプロセススレッドよりも、そう複数を使用する場合ときにその実行プロセスよりもスレッドの同時処理性能。プロセスは、オペレーティングシステムに分割され、そしてスレッドは、プロセスに分割されます。

Javaは、より高い処理性能を実現することができ、処理のJavaへの同時アクセスを行うようにすると、マルチスレッドプログラミング言語です。それが必要とされ、その後、我々は、メインクラスはミッションスレッドを定義している専用のスレッドを持っている必要がありますにJavaでマルチスレッドの定義を達成し、クラスのボディを定義することであるならば、それは特定のインターフェイスを実装したり、特定のを拡張する必要があります親彼らが完了する前に。

マルチスレッド2 Threadクラスの実装

長いなAクラスの継承をカバーするために必要な、このクラスは、クラスのメインスレッドですが、クラスを使用すると、マルチスレッド処理を達成することができることを意味するものではありません言うようにと、クラスのjava.lang.Threadのを提供するJava ()メソッド(公共無効実行())が提供するスレッドクラスの実行を書き、そしてこの方法は、メインスレッドのメソッドに属しています。
例:マルチスレッドの継承Threadクラスの実装

//实现线程的主体类,继承Thread类
//实现线程主体方法run()
class MyThread extends Thread{  //继承Thread类,实现线程的主体类
	public String title;
	
	public MyThread() {}
	
	public MyThread(String title) {
		this.title = title;
	}
	
	@Override  //实现线程主体方法run()
	public void run() {
		for(int i = 0; i < 10; i++) {
			System.out.println(this.title + "  run: i=" + i);
		}
	}
	
	
}

それはクラスを使用する場合、通常の状況下では、それは、オブジェクトをインスタンス生成しなければならないし、クラスを呼び出すために:実行する機能をマルチスレッドrun()メソッドで定義されなければならないことに留意すべきです方法が提供さが、複数のスレッドが起動する使用する必要があり、オペレーティングシステムを起動するために、そのリソーススケジューリングが伴うためrun()メソッドは、直接呼び出すことはできません()メソッドが完了すると(公共のボイド開始())。
例:マルチスタートスレッド

public class ThreadDemo {

	public static void main(String[] main) {
		MyThread threadA = new MyThread("Thread-A");
		MyThread threadB = new MyThread("Thread-B");
		MyThread threadC = new MyThread("Thread-C");
		threadA.start();
		threadB.start();
		threadC.start();
	}
}

これは、呼び出しは()メソッドを起動しているが、この時点で呼び出すことによって見つけることができますが、最終的に()メソッドを実行しているか、そして、すべてのオブジェクトが交互に実行スレッドされています。なぜだけではなく、スレッドが実行マルチスタート行う()Threadクラスのスタートを使用しなければならない方法()メソッドを使用できますか?以下は、start()メソッドソースの分析です。

public synchronized void start() {
    if (threadStatus != 0)    //线程状态判断
        throw new IllegalThreadStateException();

    group.add(this);

    boolean started = false;
    try {
        start0();  //在start()方法里面调用了start0()方法
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
           
        }
    }
}

private native void start0();  //只定义了方法名称,但是没有实现

発見スタートの内側()メソッドは、「ないIllegalThreadStateException」異常なクラスオブジェクトをスローしますが、プログラム全体を使用することは、明確な試みを投げたりしない...例外がRuntimeExcptionサブクラスでなければならないため、処理キャッチ、オブジェクトの各スレッドクラス唯一のあなたは、この例外がスローされる繰り返して起動した場合、例えば、次のコードは、例外をスローします、一度始めたことを可能。

//重复进行线程的启动
package cn.victor.demo;

class MyThread extends Thread{  //继承Thread类,实现线程的主体类
	public String title;
	
	public MyThread() {}
	
	public MyThread(String title) {
		this.title = title;
	}
	
	@Override  //实现线程主体方法run()
	public void run() {
		for(int i = 0; i < 10; i++) {
			System.out.println(this.title + "  run: i=" + i);
		}
	}
	
	
}

public class ThreadDemo {

	public static void main(String[] main) {
		MyThread threadA = new MyThread("Thread-A");
		threadA.start();
		threadA.start();
		
	}
}

/*
Exception in thread "main"
java.lang.IllegalThreadStateException
	at java.base/java.lang.Thread.start(Unknown Source)
	at javasenior/cn.victor.demo.ThreadDemo.main(ThreadDemo.java:27)

*/

Javaプログラムの実行の過程で、それがローカル・オペレーティング・システム関数呼び出しをサポートしていますので、アカウントに開発者のための需要のさまざまなレベルを取る、これはJNI(Javaネイティブ・インターフェース)技術と呼ばれているが、Javaの開発プロセスでこのような使用はお勧めしませんが、この技術の使用は、我々が提供するThreadクラスで基礎となるオペレーティング・システムのいくつかの特別な処理の機能が、START0の一部を使用することができます()このメソッドは、異なるオペレーティングシステムの実装のための必要性に依存していると述べています。

いずれの場合に限り、マルチスレッド、マルチスレッド開始の定義は、常に1つのプログラムだけであるように:スレッドクラスのstart()メソッド

マルチスレッドを達成するための3、Runnableインタフェース

実装:マルチスレッドのスレッドの継承によって定義されるが、常に継承単一継承のためにそこにされるJavaプログラムは非常にJavaで、第二のマルチスレッドの主な構造の定義を提供し、限定達成することが可能であるがjava.lang.Runnableインタフェース次のようにこのインタフェースが定義されています。

@FunctionalInterface  //从JDK 1.8引入Lambda表达式之后就变为了函数式接口
public interface Runnable{
    public void run();
}

例:メインクラスのRunnableを通じて、マルチスレッド達成するために

class MyThread implements Runnable{  //实现Runnable接口,实现线程的主体类
	public String title;
	
	public MyThread() {}
	
	public MyThread(String title) {
		this.title = title;
	}
	
	@Override  //实现线程主体方法run()
	public void run() {
		for(int i = 0; i < 10; i++) {
			System.out.println(this.title + "  run: i=" + i);
		}
	}
	
	
}

しかし、それはスレッドの親クラスを継承していないので、この時点で、その後、MyThreadクラスのこの時のために、もはや支持体には、(スタート)メソッドはこれを継承していますが、Thread.start()メソッドを使用しない場合は、マルチスレッドの起動ではありません今回私たちはによって提供さThreadクラスのコンストラクタを見てする必要があります。
(1)コンストラクタ:公共スレッド(Runnableをターゲット);
例:スタートマルチスレッド

public class ThreadDemo {

	public static void main(String[] main) {
		new Thread(new MyThread("Thread-A")).start();
		new Thread(new MyThread("Thread-B")).start();
		new Thread(new MyThread("Thread-C")).start();
		
	}
}

したがって、この場合には、もはや単一継承スレッドメインクラスが限定されている唯一のRunnableインタフェースオブジェクトを実装しているので、見ることができるこの時間マルチスレッディングは、この設計は、標準的な設計です。
それは直接、ラムダ式のスレッドクラスの実装を使用できるように、JDK 1.8の最初から見つけることができる、Runableインターフェースは、機能的なインタフェース定義を使用しています。
例:マルチスレッドラムダの使用

public static void main(String[] main) {
		for(int x = 0; x < 3; x++) {
			String title = "Thread-" + x;
			Runnable run = ()->{
				for(int y = 0; y < 10; y++) {
					System.out.println(title + " run: y=" + y);
				}
			};
			new Thread(run).start();
		}
	}

//*************************************
public static void main(String[] main) {
		for(int x = 0; x < 3; x++) {
			String title = "Thread-" + x;
			new Thread(()->{
				for(int y = 0; y < 10; y++) {
					System.out.println(title + " run: y=" + y);
				}
			}).start();
		}
	}

マルチスレッドは、優先度が将来の開発において、Runnableインタフェースを実現することであり、永遠のスレッドクラスオブジェクトによってマルチスレッドを起動します。

Runnableを持つ4スレッドの関係

それは単一回避するので確かに自身が関係する符号構造からのRunnableを使用する場合、スレッドクラスのRunnableインターフェース最も便利である:分析の一連のを見つけることができた後、既に実装プロセスの複数のスレッドに2つのアプローチを持っていました継承制限するだけでなく、より良い機能を拡張することができます。

しかし、我々はまた、構造からオープンのThreadクラスの定義をRunnableを接触を観察し、スレッドする必要があります。

public class Thread extends Object implements Runnable{}

今検索クラスは、Runnableインタフェースのサブクラスであるスレッド、それは、Threadクラスの時間が実際に上書きされたりする前に、Runnableインタフェースのrun()メソッドを継承されたプログラムのクラス構造を見て、この時そう。

プロキシデザインパターンの構造、ユーザー定義のが、メインスレッドは、プロジェクトのコア機能を実装するための責任があり、そしてすべての補助がハンドルにThreadクラスによってすべて実装を使用してマルチスレッドの設計、。

マルチスレッド(スタート呼び出し)メソッドの時間の間に開始し、その後、run()メソッドは、Threadクラスのコンストラクタによって、Runnableインタフェースオブジェクトを渡されると、そのオブジェクトは、Threadクラスのインタフェースになることを見つけるスレッドクラスはスレッドrun()メソッドを呼び出すと、ターゲットはstart()メソッドの実行に格納された属性、およびこのrun()メソッドは、Runnableインタフェースサブクラスで被覆された書かれた実行()メソッドを呼び出します。

マルチスレッドは、開発の本質は、複数のスレッドがメインスレッドスレッド、その後、同じリソースをつかむことができるということである本質的なことは記載されており、リソースの説明は、Runnableを介して行われます。


複数のスレッドを実装するための同時アクセスリソース使用率のチケットプログラム:例

package cn.victor.demo;

class MyThread implements Runnable{  //实现Runnable接口,实现线程的主体类
	private int ticket = 5;
	
	@Override  //实现线程主体方法run()
	public void run() {
		for(int i = 0; i < 10; i++) {
			if(this.ticket > 0) {
				System.out.println("sale ticket" + this.ticket--);
			}
		}
	}
	
	
}

public class ThreadDemo {

	public static void main(String[] main) {
		Runnable thread = new MyThread();
		new Thread(thread).start();
		new Thread(thread).start();
		new Thread(thread).start();
	}
}

この手順は、図を解析することにより、メモリの構造を分析するために行きました。

5呼び出し可能インターフェースマルチスレッド

あなたはマルチスレッドの実装を開発する場合の点で最も伝統からすると、確かに依存する必要がありますすることはRunnableをですが、、Runnableインタフェースは一つの欠点があります:スレッドが1.5プレゼント新のJDKに続いからそう、戻り値を取得することはできません終了するとスレッドは、インターフェイスを実装:java.util.concurrent.Callableインターフェイス、インターフェイス定義の最初の観察:

@FunctionalInterface
public interface Callable<V>{
	public V call() throws Exception;
}

あなたは利益がダウンキャストは、セキュリティリスクをもたらします回避することができるので、返されたデータのこのタイプのジェネリック、ジェネリック型を設定することができたときに呼び出し可能な定義を見つけることができます。

例:呼び出し可能なマルチスレッドを使用して

package cn.victor.demo;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

class MyThread implements Callable<String>{

	@Override
	public String call() throws Exception {
		for(int i =0; i < 10; i++) {
			System.out.println("Thread run " + i);
		}
		return "Thread over";
	}
	
}

public class ThreadDemo {

	public static void main(String[] main)throws Exception {
		FutureTask<String> futureTask = new FutureTask<String>(new MyThread());
		new Thread(futureTask).start();
		new Thread(futureTask).start();
		
		System.out.println(futureTask.get());
	}
}

質問インタビュー:違いのRunnableとコーラブルを教えてください?
インタフェースのマルチスレッド実装を提案し、呼び出し可能がJDK 1.5の後に提唱されているJDK 1.0(1)のRunnable。
(2)java.lang.Runnableのインターフェイス間で単にrun()メソッド、およびノーリターン値を提供する;
(3)界面java.util.concurrent.Callableコール()メソッドが設けられ、戻り値があってもよいです。

状態を実行している以上の6つのスレッド

マルチスレッドの発展のために、プログラミングのプロセスはに従って常にある:、その後、クラスはスレッドスレッドによって開始スレッド主なクラスの定義が、start()メソッドを呼び出すことを意味するものではありません、スレッドが稼働しています、スレッドの全体的な状態は実行中の独自のセットを持っているので。

図1に示すように、任意のオブジェクトThreadクラスのスレッドは、包装のために使用されるべきで、スレッドスタート(開始するために使用される)が、実際には、開始スレッドの数は、状態、レディ状態に設定され、現在は行われていない場合、
2 、レディ状態に入った後、あなたは状態(run()メソッド)に正常に実行した後、スレッドのスケジューリングを、スケジューリングリソースを待つ必要がありますが、すべてのスレッドがいくつかの一時停止を持っている中央の必要性を下に実行することはできませんまで例えば状態、:あなたは、リソースを作成する必要があり、時間の期間を実行した後、スレッドは、そのスレッドがブロックされた状態になり、その後、再びレディ状態に戻り、
スレッド、実際には、3、run()メソッドが終了します主なタスクは、そう、あなたは停止状態に直接行くことができ、オーバーになります。

公開された77元の記事 ウォン称賛11 ビュー2633

おすすめ

転載: blog.csdn.net/weixin_43762330/article/details/104703422