相关疑难解决方法(0)

Java执行程序:如何在任务完成时通知而不阻塞?

假设我有一个完整的任务队列,我需要提交给执行程序服务.我希望他们一次处理一个.我能想到的最简单的方法是:

  1. 从队列中获取任务
  2. 将其提交给遗嘱执行人
  3. 在返回的Future上调用.get并阻塞,直到结果可用
  4. 从队列中取出另一项任务......

但是,我试图完全避免阻塞.如果我有10,000个这样的队列,需要一次处理一个任务,我将耗尽堆栈空间,因为它们中的大多数将保持被阻塞的线程.

我想要的是提交一个任务并提供一个在任务完成时调用的回调.我将使用该回叫通知作为发送下一个任务的标志.(functionaljava和jetlang显然使用了这种非阻塞算法,但我无法理解他们的代码)

如何使用JDK的java.util.concurrent,而不是编写自己的执行器服务?

(向我提供这些任务的队列本身可以阻止,但这是一个需要解决的问题)

java callback notify executor

139
推荐指数
7
解决办法
12万
查看次数

多线程中的静态方法

我班上有以下代码

private static final SimpleDateFormat SDF_ISO_DATE = new SimpleDateFormat("yyyy-MM-dd");
private static final SimpleDateFormat SDF_ISO_TIME = new SimpleDateFormat("HH:mm:ss");

public static String getTimeStampAsString(final long time) {
    TimeZone tz = TimeZone.getTimeZone("UTC");
    SDF_ISO_DATE.setTimeZone(tz);
    SDF_ISO_TIME.setTimeZone(tz);
    return SDF_ISO_DATE.format(
        new Date(time)) + " " + SDF_ISO_TIME.format(new Date(time)
    );
}
Run Code Online (Sandbox Code Playgroud)

在我的多线程应用程序中,以下方法将来会返回日期,即使对于当前日期,静态方法或变量是否对此负责?

编辑:

我有以下代码来重现和证明答案中提到的内容,但仍然无法.可以帮助我同样的一些人.

public static void main(String[] args) throws InterruptedException, ExecutionException {

            Callable<String> task = new Callable<String>(){
                public String call() throws Exception {
                    return DateUtil.getTimeStampAsString(1524567870569L);
                }
            };

            //pool with 50 threads
            ExecutorService exec = Executors.newFixedThreadPool(50);
            List<Future<String>> results = …
Run Code Online (Sandbox Code Playgroud)

java date simpledateformat

1
推荐指数
1
解决办法
263
查看次数

标签 统计

java ×2

callback ×1

date ×1

executor ×1

notify ×1

simpledateformat ×1