Java Executor - 不并行运行线程

时间:2013-09-18 14:31:56

标签: java multithreading stored-procedures java.util.concurrent

我正在尝试使用java.util.concurrent.Executor执行独立任务并行。

我有以下工作代码

public class MiniTest {

    private static String[] input;
        static {
            input = new String[] { 
                    "task1", 
                    "task2",
                    "task3",
                    "task4"
                };
        }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(2);
        boolean atleastOnePoolStarted = false;
        for (int i = 0; i < input.length; i++) {
            Runnable worker = new WorkerThread(input[i] + i);
            executor.execute(worker);
        }
        executor.shutdown();
        executor.awaitTermination(15,TimeUnit.MINUTES);
        System.out.println("Finished all threads");
    }
}

这工作正常,我看到并行执行。

但问题是,当我将WorkerThread替换为我的另一个类Runnable时,并通过连接到数据库来执行存储过程调用。在这种情况下,线程正在启​​动,但对存储过程的实际调用似乎是以程序方式进行的,即第二个java-proc调用在第一个调用完成之前不会执行。

数据库部分工作正常,因为它是独立验证和测试的。我只需要同时打2-3个电话。我使用Sybase作为数据库。

以前有人遇到过这个问题吗?请让我知道可能出现的问题。

1 个答案:

答案 0 :(得分:0)

有几个想法可以解决可能出错的问题:

  • 您可能只打开一个连接(Sybase客户端不是多线程保存,几年前我使用它时)
  • 存储过程会锁定一些表,让第二个调用等待和阻塞。 SP在开头的某个桌面上进行某种插入,更新,删除吗?也许在交易中?那么,第二个SP将等待第一个完成。
  • 我记得Sybase在很长一段时间内的问题是创建一些对象(表,列,视图,临时表等),这些对象专门锁定了一些系统表,让第二个SP等待第一个完成创建。如果仍有可能,也许有人可以提出建议。