如何在新线程中返回值?

时间:2014-06-24 21:53:36

标签: java sql multithreading

我有这段代码,我想要返回" sql"的值。在一个新线程中,这个查询从数据库中快速而不是在主线程上发送/获取信息。如果我创建一个新线程并使用sql初始化一个字符串然后将其返回到线程的一侧,则返回null。反正我是否可以在新线程中返回sql而不是null?感谢。

public String getCurrentG(final String username) {




            Sql2o sql2o = new Sql2o(DB_URL, USER, PASS);

            String sql = "SELECT CurrentGuild FROM Players WHERE Username='" + username + "'";

            try (Connection con = sql2o.open()) {
              return con.createQuery(sql).executeScalar(String.class);
            }


        }

1 个答案:

答案 0 :(得分:2)

线程不是可以返回值的东西。线程是通过代码执行的路径。每个程序都有一个主线程,它在JVM的内部开始和结束,并且它可以通过使用Thread对象创建其他线程。

Thread对象创建的线程没有比调用某些Runnable对象的run()方法更多或更少(可能是Thread对象本身,但这是一种老式的方法。 )由于Runnable.run()没有返回值,因此线程无法返回"返回"价值。

当然,你的run()方法可以存储某个字段中的值---它自己的字段,或者它知道的其他对象中的字段。

"未来" Dgrin91提到的接口包含一个由线程存储的值。它是java.util.concurrent包的一部分。您使用java.util.concurrent.ExecutorService来管理工作线程池,并将其提供给任务"任务" (a.k.a.,Callables)将被执行。任务可以返回一个值。每次提交任务时,当线程池中的某个线程最终完成任务时,您立即返回Future对象;它将返回值存储在Future中,然后通知 Future。 Future接口提供的方法可以调用测试任务是否已完成,等待以完成任务,并获取任务返回的值。