这是我的代码
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文件中获取查询后,它会执行,但它不打印任何东西?为什么呢?
此外,我如何确保在我的所有线程完成执行后,只有当我创建另一个线程并运行它以创建另一个列表时,我的主程序才会执行。
答案 0 :(得分:2)
更改
new Thread(new Inner(parameter)).start();
到
Thread t = new Thread(new Inner(parameter));
t.start();
并将t.join();
放在 for for循环之后。
修改强>: 对于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()
}
答案 1 :(得分:1)
使用您要等待的主题的加入方法。 Thread.join() javadoc
它如何运作:
加入另一个线程(称为B)的线程(让我们称之为A)将停止执行,直到连接的线程(B)完成并返回。
编辑:
实际上,除非您的Thread处于守护进程模式,否则您的程序将不会退出。
在退出
答案 2 :(得分:1)
如果您正在使用一个线程并希望主程序等待其执行完成。您不需要使用Thread机制。相反,您可以在主程序中添加一个实际的方法到Thread.run()。 否则,如果要使用多个线程,可以使用Thread.join方法,以便所有其他线程在该行等待,直到完成所有线程执行。 我还建议你研究倒数计算机制。它可以为您提供准备好的机制,使其不会手动参与加入/等待操作。
答案 3 :(得分:0)
new Thread(runnable).start();
异步执行提供的runnable并继续执行到下一行,因此循环在将任何内容添加到列表之前执行。
因此,如果您想在线程完成后执行循环,则必须等待它。最简单的方法是运行Runnable:new Inner(parameter).run();
。
现在,这违背了并行执行的目的。
假设您有多个runnable,您可以使用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.
最后,请注意,如果您使用线程,您将在线程(工作线程和主线程)中共享runnable中的列表,并且您将需要使用线程安全结构来实现这一点 - 例如,使用CopyOnWriteArrayList:
list = new CopyOnWriteArrayList(query.execute());