StringBuffer
を介して複数のスレッドを処理できsynchronization
ますテキストが変更される可能性があり、複数のスレッドからアクセスされる場合は、StringBuffer
同期しているため、StringBufferを使用します。
マルチスレッドがいつ発生するかを誰かに説明してもらえますか?プログラムの実装でスレッドを作成しますrunnable interface or extending Thread class
か、それともOS
ベースですか?
StringBuffer
を介して複数のスレッドを処理できsynchronization
ますテキストが変更される可能性があり、複数のスレッドからアクセスされる場合は、StringBuffer
同期しているため、StringBufferを使用します。
マルチスレッドがいつ発生するかを誰かに説明してもらえますか?プログラムの実装でスレッドを作成しますrunnable interface or extending Thread class
か、それともOS
ベースですか?
スレッド化は、さまざまな方法で発生する可能性があります。スレッドを作成している場合 (例: )、またはextends Thread
ある種のスレッド モデルに渡されるオブジェクトを作成している場合 (例: implements Runnable
)、またはイベントのようなもの (例: コールバック関数) を処理するコードがどこかにある場合でも。スレッドの作成方法は重要ではありません。いずれにせよ、次のようなものがある場合:
public String someMethod()
{
StringBuilder b = new StringBuilder();
b.append("Some Method");
return(b.toString());
}
あなたはそれがスレッドセーフであることを知っています。StringBuilder
のメソッドへのアクセスは、append()
同期する必要はありません。ただし、次のようなものがある場合 (単なる例):
public class Test
{
StringBuffer b;
public Test()
{
b = new StringBuffer();
}
public String someMethod()
{
b.append("Some Method");
return(b.toString());
}
}
ここでは、実行の複数の「スレッド」が を呼び出す可能性があることがわかります。someMethod()
それらはすべて にアクセスするためStringBuffer
、同期する必要があります。特定の時点で 1 つのスレッドだけがメソッドを呼び出す場合もありますが、これが記述されている方法では、2 つのスレッドが同時にメソッドを呼び出すことは禁止されていません。aStringBuilder
を使用すると (スレッドセーフではありません)、問題が発生する可能性があります。
あなたのプログラムが2つの異なるアクション/イベントを同時に実行することができないとしましょう。次に、について考える必要がありますThreads
。論理的な観点からmultithreading
、単一のプログラムの複数の行を意味します。この場合、オペレーティングシステムは、プログラムを2つの別個の別個のプロセスとして扱います。
Javaの作成者は、スレッドを作成する2つの方法を丁寧に設計しましimplementing an interface and extending a class
た。単純なケースは、ログファイルがあり、複数のスレッドがand
そのログファイルへの書き込み中にエラーまたは警告をログに記録している場合です。
犬の匂いの感覚はですpolymorphic
。犬が猫の匂いを嗅ぐと、吠えたり、追いかけたりします。犬が食べ物の匂いを嗅ぐと、唾を吐き、ボウルに駆け寄ります。匂いの感覚は両方の状況で働いています。違いは、匂いがするもの、つまり犬の鼻が操作するデータの種類です。
例を挙げてみましょう。
//これがメインクラスです。
class ThreadTest2 {
public static void main(String args[]){
Thread thread1 = new Thread(new MyClass("thread1: "));
Thread thread2 = new Thread(new MyClass("thread2: "));
thread1.start();
thread2.start();
boolean thread1IsAlive = true;
boolean thread2IsAlive = true;
do {
if (thread1IsAlive && !thread1.isAlive()) {
thread1IsAlive = false;
System.out.println("Thread 1 is dead.");
}
if (thread2IsAlive && !thread2.isAlive()) {
thread2IsAlive = false;
System.out.println("Thread 2 is dead.");
}
} while (thread1IsAlive || thread2IsAlive);
}
}
//これが実行可能なインターフェースを実装するクラスです。
class MyClass implements Runnable {
static String message[] = { "Java", "is", "hot,", "aromatic"};
String name;
public MyClass(String id){
name = id;
}
public void run(){
for(int i=0;i<message.length;++i) {
randomWait();
System.out.println(name+message[i]);
}
}
void randomWait(){
try {
Thread.currentThread().sleep((long)(3000*Math.random()));
} catch (InterruptedException x) {
System.out.println("Interrupted!");
}
}
}
thread1 and thread2
このプログラムは、MyThreadクラスから2つの実行スレッドを作成します。次に、両方のスレッドを開始し、スレッドが終了するのを待つdoステートメントを実行します。スレッドは、Javaがホットで芳香族であることを示しています。各単語の間に短いランダムな時間を待っている間、単語ごとにメッセージを送信します。Because both threads share the console window
、プログラムの出力は、プログラムの実行中のさまざまな時点でどのスレッドがコンソールに書き込むことができたかを識別します。
それはどちらか'implementing runnable'
であり、'extending Thread'
リソース (ここでStringBuffer
は) が複数のスレッド (Java プロセス) 間で共有されている場合 /監視対象外のスコープ (つまり、ブロックStringBuffer
の外) で定義されていると仮定します。synchronize{}
StringBuffer
その場合、インスタンスを変更するためにモニター/またはロックを取得する必要がないため、複数のスレッドがインスタンスにアクセスするためにキューで待機することはありません。
Java 同時実行の詳細
Thread
たとえば、Runnable
インターフェイスやThread
マルチスレッドのクラスを介して余分な s を明示的に作成する必要があります。Java EE
これは、JVM が余分なスレッドを作成する 特定の状況にも当てはまります。
がバックグラウンドで余分なスレッドを使用している場合、OS
あなたではなくそれがスレッド セーフの責任を負うので、これについて心配する必要はありません。