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

时间:2018-10-09 01:55:44

标签: java arrays multithreading synchronized

在我的示例中,我要使用从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 116 117 118 119

但是,因为线程是同时运行的,所以两个线程都可以访问我的值,而我得到的结果是错误的,

100 101 102 103 104 105 106 107 108 109 100 101 102 103 104 105 106 107 108 109

我认为问题出在我的 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 个答案:

答案 0 :(得分:2)

您的问题似乎是SimpleThread的两个实例都分配了以100的起始值开头的值,然后从那里开始。

一种获得所需结果的方法是使用类似以下内容的方法:

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