在java中确保一个任务在另一个任务开始之前完成

在java中确保一个任务在另一个任务开始之前完成,java,jsp,servlets,Java,Jsp,Servlets,有人能告诉我一种方法,在下一个任务开始之前,用java强制完成一个任务吗?具体来说,我想编辑下面的代码,以便在调用下一个标记的两行代码之前,完成第一个标记的两行代码 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String idString = req.getParameter("id");

有人能告诉我一种方法,在下一个任务开始之前,用java强制完成一个任务吗?具体来说,我想编辑下面的代码,以便在调用下一个标记的两行代码之前,完成第一个标记的两行代码

protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
      String idString = req.getParameter("id");
      Long id = new Long(idString);
//complete the actions specified on next two lines
      School school = new SchoolDAO().findSchool(id);
      req.setAttribute("school", school);
//before even starting the actions specified on the next two lines
      List<CourseSummary> coursesummaries = new CourseSummaryDAO().findAllcsum(id);
      req.setAttribute("coursesummaries", coursesummaries);

      jsp.forward(req, resp);
}  
connection = getConnection(); //
同样,CourseSummaryDAO包含:

public class CourseSummaryDAO extends DataAccessObject{
    public List<CourseSummary> findAllcsum(Long sid) {
        LinkedList<CourseSummary> coursesummaries = new LinkedList<CourseSummary>();
        ResultSet rs = null;
        PreparedStatement statement = null;
        Connection connection = null;
        try {
            connection = getConnection(); //this is the line throwing null pointer error
      String sql = "select * from coursetotals where spid=?";
            statement = connection.prepareStatement(sql);
            statement.setLong(1, sid);
            rs = statement.executeQuery();
      //for every row, call read method to extract column 
            //values and place them in a coursesummary instance
            while (rs.next()) {
                CourseSummary coursesummary = readcsum("findAll", rs);
                coursesummaries.add(coursesummary);
            }
            return coursesummaries;
         }
         catch (SQLException e) {throw new RuntimeException(e);} 
         finally {close(rs, statement, connection);}
     }
connection = getConnection(); //
下面是一个示例(有关详细信息,请参阅)

connection = getConnection(); //
现在可以在doGet()中调用它:

connection = getConnection(); //
下面是一个示例(有关详细信息,请参阅)

connection = getConnection(); //
现在可以在doGet()中调用它:

connection = getConnection(); //

如果您有两个任务需要连续执行(即一个任务在下一个任务开始之前完成),那么最好的答案是同步执行它们。例如,假设
task1()
task2()
是任务:

connection = getConnection(); //
// Wrong way:
Runnable r1 = new Runnable(){
    public void run() {
        task1();
    }};
Runnable r2 = new Runnable(){
    public void run() {
        // Wait for r1 to finish task1 ... somehow
        task2();
    }};

// Right way:
Runnable r = new Runnable(){
    public void run() {
        task1();
        task2();
    }};
在您的例子中,
doGet
调用似乎只有在得到两个任务的结果时才能返回。因此,在这种情况下,您根本不应该使用线程。只需依次调用
task1()
task2()
。。。在请求线程上

connection = getConnection(); //

编辑

connection = getConnection(); //
查看
doGet
方法和随后添加的两个类,看起来处理已经是顺序/串行的。也就是说,第一个“任务”在第二个“任务”开始之前结束

connection = getConnection(); //

getConnection()
抛出
NullPointerException
的问题(很可能)与异步无关。但是,如果没有看到
getConnection()
的代码和完整的stacktrace,我无法确定这一点。

如果您有两个任务需要连续执行(即,一个任务在下一个任务开始之前完成),那么最好的答案是同步执行它们。例如,假设
task1()
task2()
是任务:

connection = getConnection(); //
// Wrong way:
Runnable r1 = new Runnable(){
    public void run() {
        task1();
    }};
Runnable r2 = new Runnable(){
    public void run() {
        // Wait for r1 to finish task1 ... somehow
        task2();
    }};

// Right way:
Runnable r = new Runnable(){
    public void run() {
        task1();
        task2();
    }};
在您的例子中,
doGet
调用似乎只有在得到两个任务的结果时才能返回。因此,在这种情况下,您根本不应该使用线程。只需依次调用
task1()
task2()
。。。在请求线程上

connection = getConnection(); //

编辑

connection = getConnection(); //
查看
doGet
方法和随后添加的两个类,看起来处理已经是顺序/串行的。也就是说,第一个“任务”在第二个“任务”开始之前结束

connection = getConnection(); //

getConnection()
抛出
NullPointerException
的问题(很可能)与异步无关。但是,如果没有看到
getConnection()
的代码和完整的stacktrace,我无法确定这一点。

在Java中,所有操作都是按顺序执行的,这意味着给定的代码行将在下一行开始执行任何操作之前完全完成执行。此规则的例外情况是线程起作用时。线程允许同时执行多个代码块。因为您的程序中没有使用任何线程(如果使用了,您会知道的,不用担心),所以可以保证前两行代码将在下两行开始执行之前完成

connection = getConnection(); //

所以,您的问题似乎不是您的代码运行“无序”。您的错误可能在
getConnection()
方法中的某个地方,如果这是引发NPE的原因。

在Java中,所有操作都是按顺序执行的,这意味着给定的代码行将在下一行开始执行任何操作之前完全执行完毕。此规则的例外情况是线程起作用时。线程允许同时执行多个代码块。因为您的程序中没有使用任何线程(如果使用了,您会知道的,不用担心),所以可以保证前两行代码将在下两行开始执行之前完成

connection = getConnection(); //

所以,您的问题似乎不是您的代码运行“无序”。如果引发NPE的是
getConnection()
方法,那么您的错误很可能在该方法中的某个地方。

您看到的哪些行为使您认为这些行没有首先完成?它们必须在执行到达以下行之前运行…@MattR认为他可能是指调用这些行的结果已完成,而不是执行了这些行。您可以使用CountdownLatch对象。看到这个问题@williammerrison,你能解释一下这两行是如何异步的吗?函数中的java代码不是同步的吗?谁知道findSchool(id)方法会如此复杂你看到的是什么行为让你认为这些行没有首先完成?它们必须在执行到达以下行之前运行…@MattR认为他可能是指调用这些行的结果已完成,而不是执行了这些行。您可以使用CountdownLatch对象。看到这个问题@williammerrison,你能解释一下这两行是如何异步的吗?函数中的java代码不是同步的吗?谁知道findSchool(id)方法会如此复杂我似乎在另一个java问题上走到了死胡同。你有时间看一下并帮我解决吗?我在这个链接的另一个问题中发布了它:我似乎在另一个java问题上走到了死胡同。你有时间看一下并帮我解决吗?我在这个链接的另一个问题中发布了它:如果
task1()
是一个异步任务,而您仍然希望
task2()
仅在
task1()
执行完毕后才启动该任务,该怎么办?问一个新问题。。。提供说明异步任务含义的代码。感谢您的及时回复。这里有一个问题-->如果
task1()
是一个异步任务,而您仍然希望
task2()
仅在
task1()
执行完毕后才能启动该任务,该怎么办?问一个新问题。。。提供说明异步t的含义的代码
connection = getConnection(); //