Java 控制台中未显示Executor System.out.println

Java 控制台中未显示Executor System.out.println,java,scheduledexecutorservice,Java,Scheduledexecutorservice,我的目的是在每次调用showToastLeft时显示间隔5秒的文本。使用来自的println是否可能有问题 执行者线程?我使用IntelliJ idea作为我的IDE 我将发布一个屏幕截图,显示布尔值在我的调试器中为true。 感谢您的回复……您有多个线程在没有任何并发保护的情况下读取和写入istostshewnleft变量。尝试将istoschewnleft上的所有读/写操作封装在synchronized中,看看这是否会产生影响。这里的问题可能是一个与线程相关的可见性问题:线程保留自己的变量

我的目的是在每次调用showToastLeft时显示间隔5秒的文本。使用来自的println是否可能有问题 执行者线程?我使用IntelliJ idea作为我的IDE

我将发布一个屏幕截图,显示布尔值在我的调试器中为true。


感谢您的回复……

您有多个线程在没有任何并发保护的情况下读取和写入
istostshewnleft
变量。尝试将
istoschewnleft
上的所有读/写操作封装在
synchronized
中,看看这是否会产生影响。这里的问题可能是一个与线程相关的可见性问题:线程保留自己的变量副本和重新排序操作以提高效率的微妙情况。同步是防止任何共享变量出现这种情况的一种方法,和


除了
synchronized
,如果您真的关心性能(考虑到5秒的间隔,我怀疑这一点),您还可以使用a。将
istostshewnleft
转换为
volatile
变量,是否可以侥幸逃脱,这有点主观,但是我会回避这个问题,因为
istostshewnleft
的状态会影响写入它的内容。

您不会让Java线程系统有机会在线程之间共享CPU

package com.company;

import java.io.Console;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Main {

    static boolean isToastShewnLeft = false;

    public static void main(String[] args) {

        showToastLeft("first", "", "");
        showToastLeft("second", "", "");
        showToastLeft("third", "", "");
        showToastLeft("fourth", "", "");
        showToastLeft("fifth", "", "");
    }

    public static void showToastLeft(final String paramToastString1, final String paramToastString2, final String paramToastString3) {

        final long start = System.currentTimeMillis();

        ScheduledExecutorService worker1 = Executors.newSingleThreadScheduledExecutor();

        ScheduledExecutorService worker2 = Executors.newSingleThreadScheduledExecutor();

        if (isToastShewnLeft) {

            final Runnable r = new Runnable() {
                @SuppressWarnings("StatementWithEmptyBody")
                public void run() {
                    while (isToastShewnLeft) {

                    }

                    isToastShewnLeft = true;

                    //This line does not appear in console output
                    //I can set a breakpoint on this println and see that it does execute
                    System.out.println(paramToastString1);

                    ScheduledExecutorService worker3 = Executors.newSingleThreadScheduledExecutor();

                    final Runnable r2 = new Runnable() {
                        public void run() {
                            isToastShewnLeft = false;

                            System.out.println(System.currentTimeMillis() - start + " Set toast not shewn");
                        }
                    };

                    worker3.schedule(r2, 5, TimeUnit.SECONDS);

                }
            };

            worker1.schedule(r, 0, TimeUnit.SECONDS);

        } else {
            isToastShewnLeft = true;

            System.out.println(paramToastString1);

            final Runnable r2 = new Runnable() {
                public void run() {
                    isToastShewnLeft = false;
                    System.out.println(System.currentTimeMillis() - start + " Set toast not shewn");
                }
            };

            worker2.schedule(r2, 5, TimeUnit.SECONDS);

        }
    }
}
            /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/bin/java -Didea.launcher.port=7543 "-Didea.launcher.bin.path=/Applications/IntelliJ IDEA 14 CE.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/lib/javafx-doclet.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/htmlconverter.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Users/ericsepich/IdeaProjects/untitled1/out/production/untitled1:/Applications/IntelliJ IDEA 14 CE.app/Contents/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMain com.company.Main
            first
            5008 Set toast not shewn

因此,您看到的唯一输出是
首先
,然后是
5008 Set toast not shewn
?正确。println是否可能存在线程问题?我制作了一个复制粘贴示例,可以粘贴到IntelliJ中。我目前在约塞米蒂的环境中。我认为JDK版本已经发布了。这个位置的睡眠似乎是一个重要的补充。如果没有睡眠的话,它是不起作用的。排序是我必须解决的问题。如果我不能解决它,我可能不得不发布另一个关于它的问题。非常感谢你,这些都是非常有启发性的帖子。一般来说,我认为我理解你的意思,我需要仔细阅读这些文章。我现在想的是,现在祝酒词在适当的时间间隔出现,但不是连续出现。顺序改变了。
                while (isToastShewnLeft) {
                  // Add this.
                  Thread.sleep(10);
                }