java - 运行线程对象的多个实例

标签 java multithreading

我有一个线程对象 - ThreadB,它添加了数字 1 - 100。我创建了它的 2 个实例 - b 和 c。

启动2个线程(不同的实例)并运行它。

结果:

    Waiting for b to complete...
    Total is: 4950
    Waiting for c to complete...

为什么我的第二个实例没有完成...

Java代码:

public class ThreadA {
    public static void main(String[] args){
        ThreadB b = new ThreadB();
        ThreadB c = new ThreadB();
        b.start();
        c.start();

        synchronized(b){
            try{
                System.out.println("Waiting for b to complete...");
                b.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }

            System.out.println("Total is: " + b.total);
        }

        synchronized(c){
            try{
                System.out.println("Waiting for c to complete...");
                c.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }

            System.out.println("Total is: " + c.total);
        }
    }
}

class ThreadB extends Thread{
    int total;
    @Override
    public void run(){
        synchronized(this){
            for(int i=0; i<100 ; i++){
                total += i;
            }
            notify();
        }
    }
}

最佳答案

因为当您位于第一个 ThreadB 上同步的 block 时,您的第二个 ThreadB 已完成。然后,您等待第二个 ThreadB,但 notification() 已经发生,因此您将永远在那里等待。

请注意,这并不能保证,您的程序有时可能会工作。

在 ThreadB 类中放入一些打印语句来测试这个理论。

关于java - 运行线程对象的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177774/

相关文章:

java - JMS消息重新传递

java - 为什么我的 jar 文件不能在双击时启动?

linux - 如何在Linux中控制并行任务以避免过多的上下文切换

C-Posix-cond_wait/信号

java - 使用 Disruptor 和 Executors 在 Java 中设计 Orchestrator

java - 使用 Android Studio 运行应用程序时出错

java - Play Framework 2.4授权

java - 字符串常量上的 NullPointerException

c - 条件变量的实现

Java单线程CPU使用和多线程CPU使用