如何在生成的线程完成执行时停止主进程

时间:2012-08-24 11:23:00

标签: java multithreading

这是我的代码

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 个答案:

答案 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处于守护进程模式,否则您的程序将不会退出。 在退出

之前,JVM会自动加入所有正在运行的非守护程序线程

答案 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());