单步执行多个线程
我有多个线程需要等待对方来完成一个进程。由于需求,必须这样做。如果我显示代码并显示预期的输出,那么这将是有意义的。这是我的主类:单步执行多个线程
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();
}
}
这里是螺纹作业类,(作业1和作业2类现在只是延长和调用super(名称),这是所有)
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同样的测试,线程与不同的逻辑大部分是在实际应用时运行,但不允许在工作同一时间。
基本上你想读一些关于java多线程,锁定和java内存模型。
他们以这种方式编写代码(每个线程都有自己的计数器,在访问它时没有任何同步/锁定)......基本上意味着比预期的潜在输出更多的事情会发生。
含义:两个线程都开始运行,并且将相互独立地增加它们的计数器。
嗯,准确的:它会是这样的如果你实际上使用这两个其他线程(你不是因为你是你的的Runnable调用运行,不是你的是线程)。
所以:当你实际上用三个线程进行时,那么当你查询这些计数器时你的第三个线程看到的结果是完全是不可预知的。你的代码只是一个巨大的竞争条件。
您是否注意到除了代码中的主线程之外,没有线程实际运行? – RealSkeptic
很棒的发现。我相应地更新了我的答案。 – GhostCat
我想你忘了开始你的线程 - 你直接运行runnables。线程没有做任何事情。无论如何,一旦你得到了排序,看看'CyclicBarrier'和'CountdownLatch'。 – RealSkeptic
@RealSkeptic我以为我做了......除了run()之外,我该怎么做? – Luke
啊。那么,你需要从非常基本的线程开始。使用'run'方法在当前线程**中运行runnable **,并且不启动线程。看看[Oracle教程](https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html)。 – RealSkeptic