在JAVA程序中一次只能有一个线程

在JAVA程序中一次只能有一个线程,java,multithreading,Java,Multithreading,这是我的代码(类): 我一次只需要一个线程,而且只有一个唯一的线程。首先是a1,然后是a2,然后是a1和a2,但是现在当我运行代码时,我得到了重复,就像第一个a1开始,然后是a2,然后在3-4个增量之后,a1开始,然后是a1开始,然后是a2开始,然后是a2开始。我尝试了很多不同的东西,但由于我是新手,我无法让它工作 请帮助我建议使用Thread::Join方法 public class Main { public static void main(String[] args) {

这是我的代码(类):

我一次只需要一个线程,而且只有一个唯一的线程。首先是a1,然后是a2,然后是a1和a2,但是现在当我运行代码时,我得到了重复,就像第一个a1开始,然后是a2,然后在3-4个增量之后,a1开始,然后是a1开始,然后是a2开始,然后是a2开始。我尝试了很多不同的东西,但由于我是新手,我无法让它工作


请帮助

我建议使用Thread::Join方法

public class Main {
    public static void main(String[] args) {

        Table2Thread a1 =new Table2Thread(3);
        a1.setName("Thread1");
        a1.start();
        a1.join();
        Table2Thread a2 =new Table2Thread(4);
        a2.setName("Thread2");
        a2.start();
    }
}
谢谢
Niraj Rathi

如果要使用布尔切换标志,必须多次检查它。。。像这样:

public void run() {
   while (running) {
      synchronized(sharedMonitor) {
          while (flag != thisThread) {
              sharedMonitor.wait();
          }
          //your actual logic here
          flag = nextThread;
          sharedMonitor.notifyAll();
      }
   }
}
(伪代码)

您可能需要检查附加条件。例如,如果a1的迭代次数不同于a2

我知道这不是完整的工作代码。但既然这是一项任务,我只想给你一个提示,让你自己去解决它

祝你好运


编辑:我并不认为这是最好的解决方案,也不是唯一的解决方案。

那么,在这种情况下,为什么要使用线程呢

只需将线程的逻辑放在方法(或普通类)中,然后在主循环中调用该方法

如果你真的想像这里一样使用线程,你可以做很多事情:

方法1:首先,如果你想让a1和a2保持运行,你应该有某种循环让它们一次又一次地运行。第一种方法是在main中有一个循环,在启动a1或a2之后,添加一个a1.join()/a2.join(),这样它将启动一个线程,等待它完成,然后启动下一个线程

方法2:您可以将循环放在线程中,两个线程共享一个监视器/信号量。在循环中运行逻辑之前,获取监视器,如下所示:

public void run() {
   while (running) {
      synchronized(sharedMonitor) {
          while (flag != thisThread) {
              sharedMonitor.wait();
          }
          //your actual logic here
          flag = nextThread;
          sharedMonitor.notifyAll();
      }
   }
}
方法3:
创建一个执行器,而不是自己管理线程。考虑为执行器使用2元素块队列,并且可以使用1线程线程池执行器。因此,您的主循环将继续创建表示a1/a2逻辑的Runnable,并提交给执行器以执行Runnable。

如果使用If-else,则thread2甚至不会启动。您尝试过使用监视器锁吗?没有。我不知道监视器锁。如果两个线程按顺序工作,为什么要使用它们?只需使用ExecutorService并提交任务“a1”和“a2”。@Mansoor Akram:当然有。如果创建两个线程,将有两个线程。计算机做你让它做的事。如果你不想要两个线程,就不要创建两个线程。使用a1.join,它可以工作,但首先a1在3*10=30后开始和停止,然后a2开始,我希望它们一个接一个地工作,直到程序停止。你应该去掉那些
Thread.sleep()
。他们没有帮助。切换一个标志是很好的,但是在进入循环之前,您只检查了一次。您想要的是在每次执行logoutput时切换它,然后等待另一个线程切换它。锁对象和条件可以帮助您完成这项工作。您能用修改过的代码演示给我看吗?这是我的第一堂课,我什么都不懂。方法2不能确保线程以切换方式执行(a1、a2、a1、a2……)。他必须为这一点添加逻辑。@Fildor你是对的。在我的代码中可能会有一点扭曲,因此我们添加了一个带有wait和notify组合的标志,这将起到作用。添加了一小段代码,演示在方法2中使用wait/notify。先生,我想我必须等到我的教授给出解决方案为止。;)
public static volatile boolean toggle = true;
if( isThread1 )
{
    for( ... )
    {
        while( !toggle )
        {
            Thread.sleep(100);
        }
        // Do your stuff here
        toggle = false;
    }
}
else
{
    for( ... )
    {
        while( toggle )
        {
            Thread.sleep(100);
        }
        // Do you stuff here
        toggle = true;
    }
}
public void run() {
   while (running) {
      synchronized(sharedMonitor) {
          while (flag != thisThread) {
              sharedMonitor.wait();
          }
          //your actual logic here
          flag = nextThread;
          sharedMonitor.notifyAll();
      }
   }
}