当前位置: 首页 > 知识库问答 >
问题:

如何在Java中使用两个线程将元素存储在一个数组中?

吴兴国
2023-03-14

在我的示例中,我想用100到119的整数填充索引0到19之间的myArray。

我想使用两个线程同时运行,一个线程在数组中放置从索引0到索引9的值,另一个线程从索引10到索引19。

当我打印出myArray的元素时,我期望看到的是:

100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 117 118 119

我认为问题出在addToArray()方法上,线程访问aNumber变量。

这是我们需要同步的时候吗?如果是,怎么做?

请看我的代码:

public class ThreadMain {
    SimpleThread first;
    SimpleThread second;

    public ThreadMain(String firstName, String secondName) {
        first = new SimpleThread(firstName);
        second = new SimpleThread(secondName);
    }

    public static void main(String[] args) {
        ThreadMain threadMain = new ThreadMain("FirstThread", "SecondThread");
        threadMain.startThreads();
        threadMain.waitForThreadsToFinish();
        threadMain.displayArrayElements();

    }

    private void startThreads() {
        first.start();
        second.start();
    }

    /**
     * main thread sleeps while the other threads are working.
     */
    private void waitForThreadsToFinish() {
        while (first.isAlive() || second.isAlive()) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void displayArrayElements() {
        for (int i = 0; i < 20; ++i) {
            int element = SimpleThread.getArrayElement(i);
            System.out.println(element);
        }
    }
}
class SimpleThread extends Thread {

    private int startIndex;
    private int endIndex;
    private static int[] myArray = new int[20];
    private int aNumber = 100;

    public SimpleThread(String str) {
        super(str);
    }

    public void run() {

        if (getName().equals("FirstThread")) {
            startIndex = 0;
            endIndex = 10;
            addToArray();//store value of aNumber in myArray from index 0 to index 9.
        }
        if (getName().equals("SecondThread")) {
            startIndex = 10;
            endIndex = 20;
            addToArray();//store value of aNumber in myArray from index 10 to index 19.
        }
    }

    private void addToArray() {
        for (int i = startIndex; i < endIndex; ++i) {
            myArray[i] = aNumber;
            ++aNumber;
        }
    }

    public static int getArrayElement(int index) {
        return myArray[index];
    }
}

共有1个答案

壤驷英叡
2023-03-14

您的问题似乎是SimpleThread的两个实例都赋值以100的起始值开始,然后从该值开始。

一种实现您期望结果的方法是使用以下方法:

private void addToArray(int startIndex, int endIndex) {
    for (int i = startIndex; i < endIndex; ++i) {
        myArray[i] = aNumber + startIndex; // Change is here
        ++aNumber;
    }
}
 类似资料:
  • 问题内容: 这主要是一个性能问题。我有一个字符串数组AllUids中现有的所有用户的主列表。我还列出了String数组EndUids中存在的所有已过期用户。 我正在使用Java进行工作,我的目标是从主列表AllUids中删除截止日期数组中存在的所有用户。我知道PHP有一个叫做array_diff的函数。 我很好奇Java是否具有可以比较两个数组并删除两个相似的元素的东西。我的目标是这里的性能,这就

  • 问题内容: 我见过类似的问题,但没有一个提供我所要的答案,因此,如果这被认为是重复的,我在此致歉。我正在尝试将数组{1,2,3}和{4,5,6}合并为{1,2,3,4,5,6}。我做错了什么?我是java的新手。抱歉,问题很愚蠢。 问题答案: 代替 您需要调用merge方法,并将结果分配给数组,例如: 您的for循环也应该是:

  • 问题内容: 我在这里做错了什么? 我有一个 ,但在第一个上我想在顶部填充零,在第二个上我想没有底部边框。 我尝试为此首先和最后创建类,但我认为在某处错了: 和HTML 我猜不可能有两个不同的课程吗?如果可以,我该怎么做? 问题答案: 如果要在一个元素上使用两个类,请按以下方式进行操作: 像这样在css中引用它:

  • 问题内容: 我有很多对象,我需要将它们分成两个组成一组,以供UI助手使用。 例: 通过这四个数组成为一个数组 有很多分割数组的方法。但是,如果阵列很大,什么是最有效的(成本最低)。 问题答案: 如果您正在寻找效率,则可以使用一种方法来懒散地生成每个包含2个元素的数组,因此您一次只能在内存中存储2个元素: 此方法适用于任何Array,而不仅限于Arrays。 对于Swift 1,没有协议扩展,您将拥

  • 如果我有一个双打数组: 我想得到第一个元素和最后一个元素,这样 我该怎么做?

  • 问题内容: 有没有一种快速的方法来将一个数组的值组合为另一个数组的键? 输入: 预期产量: 我该怎么办? 问题答案: 会完全按照您的意愿做。 引用手册: 通过将keys数组中的值用作键,并将values数组中的值用作对应值来创建数组。 对于您的情况,您必须执行以下操作: 当然,您也可以使用各种循环组合来做到这一点,这可能是最简单的解决方案。