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

如果您正在使用一个线程并希望主程序等待其执行完成。你不需要使用线程机制。相反,您可以将主程序中的方法实质上添加到 Thread.run() 中。否则,如果您想使用多个线程,您可以使用 Thread.join 方法,以便所有其他线程在该行等待,直到所有线程执行完成。我还建议您研究倒计时机制。它可以为您提供无需手动参与加入/等待操作的现成机制。

于 2012-08-24T11:36:29.617 回答
1

使用要等待的线程的join方法。Thread.join() javadoc

这个怎么运作 :

加入另一个线程(称为 B)的线程(我们称他为 A)将停止执行,直到加入的线程 (B) 完成并返回。

编辑
事实上,除非您的线程处于守护程序模式,否则您的程序将不会退出。JVM在退出前自动加入所有正在运行的非守护线程

于 2012-08-24T11:25:29.577 回答
0

new Thread(runnable).start();异步执行提供的 runnable 并继续执行到下一行,因此循环在任何内容添加到列表之前执行。

所以如果你想在线程完成后执行循环,你将不得不等待它。最简单的方法是运行 Runnable: new Inner(parameter).run();

现在这违背了并行执行的目的。

假设您有多个可运行对象,您可以使用 ExecutorService(而不是使用更复杂且容易出错的低级 Thread 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 回答