java - 在线程中计数

标签 java

为什么程序不打印 9 而打印 0?
AtomicInteger 也没有帮助(按照建议)

 public class threadOne{
    //Integer i=0;
    AtomicInteger i=new AtomicInteger(0);

    class firstThread implements Runnable{
        AtomicInteger i;
        firstThread(AtomicInteger i){
            this.i=i;
        }
        public void run(){
            while(i.intValue()<10){
                i.incrementAndGet();
            }
        }       
    }

    void runThread(){ 
        Thread t = new Thread(new firstThread(i));
        t.start();
        System.out.println("Result : " + i.intValue());
    }

    public static void main(String[] args){
        new threadOne().runThread();

    }

}

最佳答案

记住:您正在打印 threadOnei,而不是 firstThread

两个类中的整数 i彼此独立。其中一项的变化不会反射(reflect)在另一项上。 Integer 是一个不可变的类。

例如,

Integer i = 4;
Integer j = i;
j = 1; //same as j = new Integer(1);
System.out.println(i);

它打印 4 而不是 1。同样的方式,firstThread 中的 i+=1 不会影响 threadOne 中的 i,即您要执行的操作。正在打印。

您可以使用可变类,例如 AtomicInteger ,它会满足您的期望,或者简单地打印 firstThread

i

编辑:您需要等待线程执行完成才能看到更改。做

Thread t = new Thread(new firstThread(i));
t.start();
try{
    t.join();
}catch(Exception e){}
System.out.println("Result : " + i.get());

关于java - 在线程中计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43949941/

相关文章:

java - 为 Bukkit 插件添加颜色代码支持

用于将带有字段和启动宏的 MS Word 文件转换为 PDF 的 Java API

java - 如何将 notifyDataSetChanged() 与包含带有 ListView 的 fragment 的 viewpager 一起使用

java - 如何匹配类(class)

java - 在android中的微调器中设置默认值

javascript - 使用 AJAX/JQUERY 将每个 <td> 中的数据附加到 JSP 生成的表中

java - 在 java 中使用 postagger 后从单词中删除标签

java - 获取您在 JPanel 上单击的位置的颜色?

java - Java 中的方法 - void

java - 为什么我无法在 NetBeans 之外打开我的 JAR?