Java8;在一个线程上利用睡眠时间,但是有多个可调用对象 - java

在标准java8中是否可以在单个线程上同时执行多个可调用对象?
也就是说,当一个可调用对象进入睡眠状态时,请开始处理另一个可调用对象。

我目前的实验不起作用:

    ExecutorService executor = Executors.newSingleThreadExecutor();
    List<Future> fs = new ArrayList<>();
    for (int i = 0; i < 2; i++) {
        final int nr = i;
        fs.add(executor.submit(() -> {
            System.out.println("callable-" + nr + "-start");
            try { Thread.sleep(10_000); } catch (InterruptedException e) { }
            System.out.println("callable-" + nr + "-end");
            return nr;
        }));
    }
    try { executor.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException e) { }

结果是:

callable-0-start
callable-0-end
callable-1-start
callable-1-end

我希望有:

callable-0-start
callable-1-start
callable-0-end
callable-1-end

笔记:

我有点期望得到一个答案:“不,这不可能。线程无法工作。一旦将线程分配给某些可执行代码,它就会运行直到完成,异常或取消。在可调用对象/可运行对象之间不能进行中间切换。 cc>仅允许其他线程在CPU /内核上运行。” (明确的确认会让我安心)
自然,这是“玩具”示例。
这是关于理解的问题,而不是我遇到的一些具体问题。

java参考方案

您尝试做的是模拟旧Java版本中不推荐使用的功能。那时可以停止,暂停或恢复Thread。但是从Thread.stop的javadoc:

这种方法本质上是不安全的。使用Thread.stop停止线程会导致它解锁所有已锁定的监视器(由于未经检查的ThreadDeath异常会自然传播堆栈)。如果先前由这些监视器保护的任何对象处于不一致状态,则损坏的对象将变为其他线程可见,从而可能导致任意行为。 stop的许多用法应该由简单地修改某些变量以指示目标线程应停止运行的代码代替。目标线程应定期检查此变量,如果该变量指示它将停止运行,则应有序地从其运行方法返回。如果目标线程等待很长时间(例如,在条件变量上),则应使用中断方法来中断等待。

如该摘要所述,执行所需操作的风险至关重要,因此,不建议使用此行为。

我建议,不要尝试从外部强制运行中的线程进入某种暂停状态,您可能应该考虑使用ThreadPool API,该API可让您正确打包代码段,以便可以从代码段中卸载它们的状态。线程,然后恢复。例如创建Ticket,这将是一个基本作业,一个线程将始终在开始另一个作业之前完成,该TicketChain依次连接票证并存储状态。然后制作一个处理票证的处理程序。万一当前无法完成票证(例如,因为并非所有数据都存在,或者无法获取某些锁),线程可以跳过该票证,直到稍后的某个时间点为止(此时所述条件可能为真)。

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java-固定大小的列表与指定初始容量的列表之间的差异 - java

我在理解这一点上遇到了问题。当我们做 List<Integer> list = Arrays.asList(array); 我们不能在该列表上使用添加,删除之类的方法。我知道Arrays.asList()返回固定大小的列表。我不明白的是,如果我们创建一个具有指定初始容量的列表,例如List<Integer> list2 = new A…

从方法返回数组-Java - java

private static Coordinate[] getCircleCoordintaes() { Coordinate coordinates[] = {new Coordinate(0, 0)}; return coordinates; } 以上程序工作正常。在上面的程序中,返回的坐标数组首先初始化了数组使用这条线Coordinate coordi…

Java Swing SearchBox模型 - java

我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。