java—如何在派生线程完成执行时停止主进程

jobtbby3  于 2021-07-09  发布在  Java
关注(0)|答案(4)|浏览(378)

这是我的密码

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文件中得到查询后,它会执行,但不会打印任何内容?为什么?
另外,如果我创建了另一个线程并运行它来创建另一个列表,那么如何确保在所有线程执行完毕之后,只有主程序在执行中向前移动。

2nc8po8w

2nc8po8w1#

改变

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

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

t.join(); 在你的for循环之后。
编辑:对于5个或任意数量的线程说n
创建这样的线程数组

Thread[] tArray = new Thread[n];

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

//your code to start the thread goes here

}

一旦你启动了它们,在main函数的末尾再次遍历它们,将它们连接到主线程。

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

tArray.join()

}
cbjzeqam

cbjzeqam2#

使用要等待的线程的join方法。thread.join()java文档
工作原理:
连接另一个线程(称为b)的线程(称为a)将停止它的执行,直到连接的线程(b)完成并返回。
编辑:
实际上,除非线程处于守护程序模式,否则程序不会退出。jvm在退出之前自动加入所有正在运行的非守护进程线程

qij5mzcb

qij5mzcb3#

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

vdzxcuhz

vdzxcuhz4#

new Thread(runnable).start(); 异步执行提供的runnable,并将执行继续到下一行,因此循环在向列表中添加任何内容之前执行。
因此,如果要在线程完成后执行循环,则必须等待它。最简单的方法是运行runnable: new Inner(parameter).run(); .
这就违背了并行执行的目的。
假设您有多个runnable,您可以使用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.

最后,请注意,如果您使用线程,您将在runnable中跨线程(工作线程和主线程)共享列表,并且需要使用线程安全结构来实现这一点—例如,通过使用copyonwritearraylist:

list = new CopyOnWriteArrayList(query.execute());

相关问题