1

これが私のコードです

public class Main {

private static class GetData implements Runnable{

    private List list;
    private SqlQuery query;
    GetData(SqlQuery<String> param){
        this.query=param;
    }

    public void run(){


        list = query.execute();

    }

}


public static void main(String[] args){

    ApplicationContext context = new      ClassPathXmlApplicationContext("database.xml");
    SqlQuery<String> parameter =  (SqlQuery<String>) context.getBean("BEAN_NAME");

    System.out.println("hello");


    new Thread(new Inner(parameter)).start();


   for(each element in list of inner class){

       System.out.println(element.id);
   }

}

}

私の質問は、xmlファイルからクエリを取得した後、実行されますが、何も出力されないということです。なんで?

また、すべてのスレッドの実行が終了した後、別のスレッドを作成して実行し、別のリストを作成する場合にのみ、メインプログラムが実行を進めるようにするにはどうすればよいですか。

4

4 に答える 4

2

変化する

new Thread(new Inner(parameter)).start();

Thread t = new Thread(new Inner(parameter));
t.start();

forループのt.join(); に置き ます。

編集:5つまたは任意の数のスレッドの場合はnと言います

このようなスレッドの配列を作成します

Thread[] tArray = new Thread[n];

for (int j = 0; j < tArray .length; j++) {

//your code to start the thread goes here

}

それらをすべて開始したら、メイン関数の最後でもう一度ループして、それぞれをメインスレッドに結合します。

for (int j = 0; j < tarray .length; j++) {

tArray.join()

}
于 2012-08-24T11:27:54.897 に答える
1

待機するスレッドのjoinメソッドを使用します。Thread.join()javadoc

使い方 :

別のスレッド(Bと呼ばれる)に結合するスレッド(彼をAと呼びます)は、結合されたスレッド(B)が終了して戻るまで、実行を停止します。

編集
実際、スレッドがデーモンモードでない限り、プログラムは終了しません。JVMは、終了する前に、実行中のすべての非デーモンスレッドに自動的に参加します

于 2012-08-24T11:25:29.577 に答える
1

1つのスレッドを使用していて、メインプログラムが実行の完了を待機するようにしたい場合。スレッドメカニズムを使用する必要はありません。代わりに、メインプログラムのメソッドを実質的にThread.run()に追加できます。それ以外の場合、複数のスレッドを使用する場合は、Thread.joinメソッドを使用して、他のすべてのスレッドがすべてのスレッドの実行が完了するまでその行で待機するようにすることができます。また、カウントダウンラッチメカニズムを調査することをお勧めします。手動で参加/待機操作に関与しない準備ができたメカニズムを提供できます。

于 2012-08-24T11:36:29.617 に答える
0

new Thread(runnable).start();提供されたランナブルを非同期で実行し、次の行まで実行を継続するため、リストに何かが追加される前にループが実行されます。

したがって、スレッドが終了した後にループを実行する場合は、それを待つ必要があります。最も簡単な方法は、Runnableを実行することですnew Inner(parameter).run();

これで、並列実行の目的が無効になります。

複数の実行可能ファイルがある場合は、ExecutorServiceを使用して(使用がより複雑でエラーが発生しやすい低レベルのスレッドAPIを使用する代わりに)、さまざまなタスクを並行して実行し、すべてのタスクが完了したら結果を収集できます。完了:

ExecutorService executor = Executors.newCachedThreadPool();
executor.submit(runnable1); //first task
executor.submit(runnable2); //second task

executor.shutdown(); //stop accepting new tasks
executor.awaiTermination(Integer.MAX_VALUE, TimeUnit.SECONDS); //wait until both tasks finish

//now you can use the results of your tasks.

最後に、スレッドを使用する場合は、ランナブル内のリストをスレッド間(ワーカースレッドとメインスレッド)で共有することに注意してください。これを可能にするには、スレッドセーフ構造を使用する必要があります。たとえば、CopyOnWriteArrayList

list = new CopyOnWriteArrayList(query.execute());
于 2012-08-24T11:27:30.607 に答える