我有多个线程需要等待彼此进行处理。由于要求,必须以这种方式完成。如果我显示代码并显示预期的输出,那将是有意义的。这是我的主要课程:
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; }
}
这是预期的输出:
Thread1: job 1 complete
Thread2: job 1 complete
Thread1: job 2 complete
Thread2: job 2 complete
Thread1: job 3 complete
Thread2: job 3 complete
以下是我的代码的输出:
Thread1: job 1 complete
Thread1: job 2 complete
Thread1: job 3 complete
Thread2: job 1 complete
Thread2: job 2 complete
Thread2: job 3 complete
问题:如何让线程暂停,允许放手,然后继续。差不多,我怎样才能让他们继续前进并等待产生预期的输出。谢谢!
重要说明:这需要适用于x个线程,我只是在测试2.此外,线程在实际应用程序中大部分时间以不同的逻辑运行但不是允许同时工作。
答案 0 :(得分:1)
基本上你想阅读一些关于java多线程,锁定和java内存模型的内容。
他们编写代码的方式(每个线程都有自己的计数器,访问时没有任何同步/锁定)...基本上意味着可能发生的事情比你预期的潜在输出更多。
含义:两个线程都开始运行,并且将完全独立地增加其计数器。
嗯,确切地说:就像如果你实际上使用那两个其他线程(你不是那么称为 Runnables 上运行,而不是你的主题。)
所以:当你真正使用三个线程时,那么你的第三个线程在查询这些计数器时看到的是完全不可预测。你的代码只是一个巨大的竞争条件。