2015-05-26 116 views
0
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 

我的目的是在showToastLeft的每个调用之间显示5秒的文本。执行程序线程使用来自 的println有没有问题?我使用IntelliJ的想法作为我的IDE。Executor System.out.println未在控制台中显示

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

感谢您的任何反应....

+0

所以你看到的唯一的输出是'第一'然后'5008设置烤面包没有shewn'? –

+0

正确。 println有可能存在线程问题吗? – Giuseppe

+0

我做了一个可以粘贴到IntelliJ中的复制粘贴示例。我目前在优胜美地环境中。我认为JDK版本已发布。 – Giuseppe

回答

2

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

   while (isToastShewnLeft) { 
        // Add this. 
        Thread.sleep(10); 
       } 
+0

在这个位置的睡眠似乎是一个关键的补充。没有时间的睡眠,它是行不通的。 – Giuseppe

+0

排序是我必须解决的问题,如果我无法弄清楚,我可能不得不发表另外一个问题。非常感谢你们这些非常有启发性的职位。 – Giuseppe

1

你有多个线程读取,没有任何保护的并发写入isToastShewnLeft变量。尝试在isToastShewnLeft的​​上附上所有读/写操作,看看这是否有所作为。这里的问题可能是线程相关的可见性问题:线程保留自己的变量副本和重新排序操作以提高效率的细微情况。同步是阻止任何共享变量的一种方法。 Here is one good explanation of visibilityhere is another

除了​​,你可以使用java.util.concurrent.AtomicBoolean,如果假设你真的关心性能(我怀疑给定了5秒的间隔)。不管你是否可以将isToastShewnLeft变成volatile变量,但是我认为isToastShewnLeft的状态会影响所写的内容,我都会回避这一点。

+0

通常我想我明白你在说什么,我需要阅读这些文章。现在我正在考虑的部分是,现在这个敬酒正在适当的时间间隔内展示,但它们并没有相继出现。订单已更改。 – Giuseppe

相关问题