0

私は1つのマルチスレッドの問題に直面しています。

私は10個のスレッドを持っています。アプリケーションを開始すると、最初のスレッドがフォルダーを作成しようとします。フォルダーを作成する前に、残りのスレッドがファイルをそのフォルダーに移動しようとしていることを意味します.so私はNulpointerExceptionを取得しています。フォルダークリエータースレッドが完了するまで残りの広告を停止する方法。

次のようなコード:

    Static int i;
moveFile()
{
if(i==1){
create();
}
move(){
}
}
4

3 に答える 3

2

サイズ 1のラッチ (カウントダウン ラッチ) を作成します。

フォルダーを作成するスレッドcountdown()では、フォルダーが作成された後にラッチのメソッドを呼び出します。他のすべてのスレッドawait()では、ファイルの移動などの処理を開始する前に、ラッチでメソッドを呼び出します。

他にも無数の方法があります。可能であれば、最も単純なアプローチを選択してください (フォルダが作成された後にのみファイルを移動するスレッド/タスクを生成します)。

于 2013-06-20T10:11:39.417 に答える
2

さまざまな方法でそれを行うことができます。

  1. スレッドにフォルダーが存在することを確認し、ファイルをその中に配置します
  2. これが起こらないように、フォルダーの作成後にのみ 2 番目のスレッドを実行します。複数のフォルダーがあり、非常に多くのファイルがある場合は、フォルダーの作成が完了した後に新しいスレッドを起動し、2 番目のスレッドがファイルをその特定のフォルダーに専用にプッシュします。
于 2013-06-20T10:07:46.510 に答える
0

Thread.join() はあなたが探しているものだと思います。実行が終了するまで、(おそらくタイムアウトを使用して) スレッドで wait() を実行します。

「フォルダ スレッド」の参照を他の「ファイル スレッド」のそれぞれに渡し、それを join() します。

例:

public class JoinThreads {
static ArrayList<FileThread> fthreads = new ArrayList<FileThread>();
public static void main(String[] args) {
    Thread folderThread = new Thread () {
        @Override
        public void run() {
            // Create the folder
        }
    }.start();
    // Add new threads to fthreads, pass folderThread to their constructor 
    for (FileThread t : fthreads) {
        t.start();
    }
}

public class FileThread extends Thread {
    Thread folderThread;
    File file;

    public FileThread(Thread folderThread, File file) {
        this.folderThread = folderThread;
    }
    @Override
    public void run() {
        try {
            folderThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Save the file, folder should already exist!
    }
}

}

于 2013-06-20T10:43:32.147 に答える