java - 单步执行多个线程

标签 java

我有多个线程需要互相等待才能完成一个进程。由于要求,必须这样做。如果我显示代码并显示预期输出,那就有意义了。这是我的主要类(class):

public static ThreadedJob job1, job2;
public static ArrayList<Thread> threads = new ArrayList<Thread>();
public static void main(String[] rags) throws InterruptedException{
    job1 = new Job1("Thread1:");
    job2 = new Job2("Thread2:");
    job1.run();
    job2.run();
    threads.add(new Thread(job1));
    threads.add(new Thread(job2));
    if (job1.getCounter() > job2.getCounter()) {
        threads.get(0).wait();
        threads.get(1).notify();
    }
    if (job1.getCounter() < job2.getCounter()) {
        threads.get(1).wait();
        System.out.println(true);
        threads.get(0).notify();
    }
}

这是线程作业类,(Job1 和 Job2 类现在只需扩展并调用 super(name) 即可)

public class ThreadedJob implements Runnable{



protected String name;
protected int counter = 0;
public ThreadedJob(String name){
    this.name = name;
}

@Override
public void run() {

    System.out.println(name + " job 1 complete");
    counter++;
    System.out.println(name + " job 2 complete");
    counter++;
    System.out.println(name + " job 3 complete");
    counter++;


}

public int getCounter(){ return counter; }

}

这是预期的输出:

线程 1:作业 1 完成 线程 2:作业 1 完成 主题 1:作业 2 完成 线程 2:作业 2 完成 主题 1:作业 3 已完成 线程2:作业3完成

这是我的代码的输出:

线程 1:作业 1 完成 主题 1:作业 2 完成 主题 1:作业 3 已完成 线程 2:作业 1 完成 线程 2:作业 2 完成 线程2:作业3完成

问题:我怎样才能让线程暂停,允许释放,然后继续。差不多,我怎样才能让他们开始并等待产生预期的输出。谢谢!

重要说明:这需要适用于 x 数量的线程,我只是用 2 个线程进行测试。此外,线程在实际应用程序中大多数时间都以不同的逻辑进行操作,但并非如此允许同时工作。

最佳答案

基本上,您想了解一些有关 Java 多线程、锁定和 Java 内存模型的知识。

它们是您编写代码的方式(每个线程都有自己的计数器,访问它时没有任何同步/锁)...基本上意味着可能发生的事情比您期望的潜在输出多得多。

含义:两个线程都开始运行,并且将完全独立地增加其计数器。

嗯,准确地说:如果你实际上使用这两个其他线程(你不是像你所说的>在您的Runnables上运行,而不是您的线程)。

所以:当您实际上使用三个线程时,那么您的第三个线程在查询这些计数器时看到的内容是完全不可预测的。您的代码只是一个巨大的竞争条件。

关于java - 单步执行多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37827897/

相关文章:

bundle - Launch4J - 为 Windows 7 64 位计算机 bundle JRE

java - 如何修复有关 switch 语句的输出?

java - Android 从 SQLite 数据库填充字符串数组

java - JUnit 测试在不应该执行的时候执行

java - Java 中的通配符参数化类型

java - 将对象转换为字符串获取无法转换错误

java - 如何用java定位并执行文件

java - org.springframework.web.HttpMediaTypeNotSupportedException : Content type 'application/xml;charset=UTF-8' not supported

java - 如何配置 Spring 从调度程序 servlet 调用图像服务 servlet?

java - 为什么保护字段对子类不可见?