1

这是我的代码(类):

package table2thread;

import java.util.logging.Level;

import java.util.logging.Logger;

public class Table2Thread extends Thread {

    private int j;
    private boolean flag;

    Table2Thread(int j0) {
        j = j0;
    }

    public void run() {

        if (Thread.currentThread().getName().equals("Thread1")) {
            for (int i = 1; i < 11; i++) {
                System.out.println(j + "*" + i + "=" + j * i);
                flag = true;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Table2Thread.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } else if (Thread.currentThread().getName().equals("Thread1") && flag == true) {
            for (int i = 1; i < 11; i++) {
                System.out.println(j + "*" + i + "=" + j * i);
                flag = false;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Table2Thread.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}

这是我的主要课程:

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

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

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

请帮忙

4

3 回答 3

2

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

(伪代码)

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;
    }
}

您可能需要检查其他条件。例如,如果 a1 的迭代次数与 a2 不同。

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

祝你好运!

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

于 2013-09-18T07:15:59.910 回答
1

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

只需将您的线程逻辑放在一个方法(或一个普通类)中,然后在您的 main 中,只需循环调用该方法即可。

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

方法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:与其自己管理线程,不如创建一个Executor。考虑为执行器使用 2 元素块队列,您可以使用 1 线程线程池执行器。因此,您的主循环将继续创建代表 a1/a2 逻辑的 Runnable,并将其提交给executeRunnable 的执行程序。

于 2013-09-18T07:23:12.800 回答
0

我建议使用 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();
    }
}

谢谢尼拉吉·拉蒂

于 2013-09-18T06:29:53.413 回答