在我的示例中,我想用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];
}
}
您的问题似乎是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循环也应该是:
问题内容: 我有很多对象,我需要将它们分成两个组成一组,以供UI助手使用。 例: 通过这四个数组成为一个数组 有很多分割数组的方法。但是,如果阵列很大,什么是最有效的(成本最低)。 问题答案: 如果您正在寻找效率,则可以使用一种方法来懒散地生成每个包含2个元素的数组,因此您一次只能在内存中存储2个元素: 此方法适用于任何Array,而不仅限于Arrays。 对于Swift 1,没有协议扩展,您将拥
问题内容: 我在这里做错了什么? 我有一个 ,但在第一个上我想在顶部填充零,在第二个上我想没有底部边框。 我尝试为此首先和最后创建类,但我认为在某处错了: 和HTML 我猜不可能有两个不同的课程吗?如果可以,我该怎么做? 问题答案: 如果要在一个元素上使用两个类,请按以下方式进行操作: 像这样在css中引用它:
如果我有一个双打数组: 我想得到第一个元素和最后一个元素,这样 我该怎么做?
问题内容: 有没有一种快速的方法来将一个数组的值组合为另一个数组的键? 输入: 预期产量: 我该怎么办? 问题答案: 会完全按照您的意愿做。 引用手册: 通过将keys数组中的值用作键,并将values数组中的值用作对应值来创建数组。 对于您的情况,您必须执行以下操作: 当然,您也可以使用各种循环组合来做到这一点,这可能是最简单的解决方案。