【问题标题】:Java Executor - not running threads in parallelJava Executor - 不并行运行线程
【发布时间】:2013-09-18 14:31:55
【问题描述】:

我正在尝试使用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 作为数据库。

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

【问题讨论】:

  • 您的Runnable 实现很可能是同步的,例如,只有1 个与它们必须共享的数据库的连接。显示“其他类”。

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


【解决方案1】:

关于可能出错的几个想法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多