0

私がやろうとしているのは、グローバル変数クラスを持ち、関数が読み取り/書き込みを行うことができるようにすることです。

私が今持っているのは

import java.lang.*;             
import lab1.Global;
public class SecondProgram {
     public static void main ( String args[] ) {
            System.out.println("hi ");
            Global.b[0] = " zero ";
            Global.b[1] = " One ";
            Global.b[2] = " Two ";
            Global.b[3] = " Three ";

        }
}

グローバル変数を格納するクラスを作成しました

public class Global {
  public static String a = "hi" ;
  public static String [] b;
}

もちろん、配列のサイズがハードコードされた定数ではなく、ある時点で見つけてプラグインできる変数であることが重要です。

私がやろうとしていることをコードから理解でき、それを機能させる方法を知っていることを願っています。

ありがとう!

4

3 に答える 3

3

スレッドにテキストファイルから配列にデータを読み取らせるため、グローバル変数が必要です。スレッドが作業を終了した後も、配列とそのデータが存在し続けることが重要です。

まあそれはうまくいきません。または、少なくとも、それは確実に機能しません(そしてある意味でそれはより悪い結果です!)

マルチスレッドのJavaプログラムでは、情報が相互に渡されるポイントでスレッドが適切に同期することを確認する必要があります。同期の目的は2つあります。

  • 競合状態を防ぐため。つまり、あるスレッドが別のスレッドが値を読み取る前に値を読み取ろうとする場合、
  • メモリキャッシュの影響により、スレッドが値の古いコピーを認識しないようにするため。

ベアグローバル変数の同期は非常に困難になります。私のアドバイスは

  • コメント(上記)に注意を払い、クラスを使用して状態をカプセル化するように設計および実装します。

  • のユーティリティクラスを使用してjava.util.concurrent、共有データ構造を実装し、スレッドの作成/管理を処理します。たとえば、ExecutorServiceAPIを見てください。

  • Javaでの並行プログラミングに関する優れた教科書を入手してください。Javaでの並行性は単純ではありません。何をしているのかわからない場合は、断続的な障害の原因を追跡するために数時間/日/週/月を費やすことができます。

于 2012-08-25T01:14:23.190 に答える
1

これははるかに優れたアプローチであり、始めるための何かだと思います。

import java.util.ArrayList;

public class SecondProgram {

    private static ArrayList <String>file = new ArrayList();

    public synchronized boolean  writeFile(String str){
        //wrtite file to your list
        file.add(str);
        return true;
    }
    public static void main(String args[]) {
        //read file and use the synchronized method to write it to your list
    } 
}
于 2012-08-25T00:47:31.593 に答える
1

私はグローバルの使用を推奨していませんが、必要に応じて、次のようなことを行うことができます。一般的には、各スレッドに独自のデータを構築させます。作業が終了したら、同期されたグローバルコレクション(この場合はList<List<String>>)にデータを追加します。次に、すべてのスレッドが作業を終了したら、そのコレクションを読みます。

データを収集するグローバル:

public class GlobalDataBroker {
    public static List<List<String>> data = Collections.synchronizedList(new LinkedList<List<String>>());
}

実装例:

public static void main(String[] args) throws InterruptedException {
    for (int i=0; i < 10; i++) {
        new Thread(new Runnable(){
            @Override
            public void run() {
                List<String> list = new LinkedList<String>();
                list.add(String.format("I'm a Thread and my name is %s.",Thread.currentThread()));
                for (int i = 0; i < 5; i++) {
                    list.add("Data!");
                }
                GlobalDataBroker.data.add(list);
            }
        }).start();
    }

    // When the threads are done ...            
    Iterator<List<String>> i = GlobalDataBroker.data.iterator();
    while (i.hasNext()) {
        System.out.println(i.next());
    }
}

出力:

[I'm a Thread and my name is Thread[Thread-8,5,main]., Data!, Data!, Data!, Data!, Data!]
[I'm a Thread and my name is Thread[Thread-5,5,main]., Data!, Data!, Data!, Data!, Data!]
...
[I'm a Thread and my name is Thread[Thread-7,5,main]., Data!, Data!, Data!, Data!, Data!]

データの書き込みが完了してから、データの反復を開始する必要があることに注意してください。(そうしないと、恐ろしいことに遭遇する可能性がありますConcurrentModificationException。)

于 2012-08-25T01:19:11.653 に答える