这是我的密码
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条答案
按热度按时间2nc8po8w1#
改变
到
把
t.join();
在你的for循环之后。编辑:对于5个或任意数量的线程说n
创建这样的线程数组
一旦你启动了它们,在main函数的末尾再次遍历它们,将它们连接到主线程。
cbjzeqam2#
使用要等待的线程的join方法。thread.join()java文档
工作原理:
连接另一个线程(称为b)的线程(称为a)将停止它的执行,直到连接的线程(b)完成并返回。
编辑:
实际上,除非线程处于守护程序模式,否则程序不会退出。jvm在退出之前自动加入所有正在运行的非守护进程线程
qij5mzcb3#
如果您正在使用一个线程,并且希望主程序等待其执行完成。您不需要使用线程机制。相反,您可以在主程序中向thread.run()添加一个方法。否则,如果要使用多线程,可以使用thread.join方法,以便所有其他线程在该行等待,直到所有线程执行完成。我还建议你研究倒计时锁机制。它可以为您提供就绪机制,使您不必手动参与join/wait操作。
vdzxcuhz4#
new Thread(runnable).start();
异步执行提供的runnable,并将执行继续到下一行,因此循环在向列表中添加任何内容之前执行。因此,如果要在线程完成后执行循环,则必须等待它。最简单的方法是运行runnable:
new Inner(parameter).run();
.这就违背了并行执行的目的。
假设您有多个runnable,您可以使用executorservice(而不是使用较复杂且容易出错的低级线程api)并行运行各种任务,并在它们全部完成时收集结果:
最后,请注意,如果您使用线程,您将在runnable中跨线程(工作线程和主线程)共享列表,并且需要使用线程安全结构来实现这一点—例如,通过使用copyonwritearraylist: