-1

StringBufferを介して複数のスレッドを処理できsynchronizationますテキストが変更される可能性があり、複数のスレッドからアクセスされる場合は、StringBuffer同期しているため、StringBufferを使用します。

マルチスレッドがいつ発生するかを誰かに説明してもらえますか?プログラムの実装でスレッドを作成しますrunnable interface or extending Thread classか、それともOSベースですか?

4

4 に答える 4

3

スレッド化は、さまざまな方法で発生する可能性があります。スレッドを作成している場合 (例: )、または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を使用すると (スレッドセーフではありません)、問題が発生する可能性があります。

于 2013-01-28T06:13:03.227 に答える
2

あなたのプログラムが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、プログラムの出力は、プログラムの実行中のさまざまな時点でどのスレッドがコンソールに書き込むことができたかを識別します。

于 2013-01-28T08:23:11.437 に答える
2

それはどちらか'implementing runnable'であり、'extending Thread'

リソース (ここでStringBufferは) が複数のスレッド (Java プロセス) 間で共有されている場合 /監視対象外のスコープ (つまり、ブロックStringBufferの外) で定義されていると仮定します。synchronize{}

StringBufferその場合、インスタンスを変更するためにモニター/またはロックを取得する必要がないため、複数のスレッドがインスタンスにアクセスするためにキューで待機することはありません。

Java 同時実行の詳細

于 2013-01-28T06:05:02.240 に答える
1

Threadたとえば、RunnableインターフェイスやThreadマルチスレッドのクラスを介して余分な s を明示的に作成する必要があります。Java EEこれは、JVM が余分なスレッドを作成する 特定の状況にも当てはまります。

がバックグラウンドで余分なスレッドを使用している場合、OSあなたではなくそれがスレッド セーフの責任を負うので、これについて心配する必要はありません。

詳細については、Java チュートリアルの同時実行セクションを参照してください。

于 2013-01-28T06:07:35.063 に答える