作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在学习java并尝试线程和使用synchronizedlist。
package Multithreading;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args){
List<Integer> list = Collections.synchronizedList(new ArrayList<Integer>(10));
for(int i=0; i<10; i++){
list.add(0);
}
Thread a = new Thread(new CardPicker(list));
Thread b = new Thread(new CardPicker(list));
Thread c = new Thread(new CardPicker(list));
Thread d = new Thread(new CardPicker(list));
Thread e = new Thread(new CardPicker(list));
Thread f = new Thread(new CardPicker(list));
Thread g = new Thread(new CardPicker(list));
Thread h = new Thread(new CardPicker(list));
a.start();
b.start();
c.start();
d.start();
e.start();
f.start();
g.start();
h.start();
int startTime = (int) System.currentTimeMillis();
while((int) System.currentTimeMillis()-startTime<10000){
}
System.out.println(list.toString());
}
}
package Multithreading;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class CardPicker implements Runnable{
List<Integer> list;
public CardPicker(List<Integer> list2){
this.list = list2;
}
@Override
public void run() {
Random rnd = new Random();
int hold = rnd.nextInt(10);
while(true){
list.set(hold, list.get(hold)+1);
}
}
}
不知何故,输出给了我这样的东西:
[13289041, 13038238, 0, 13427372, 10113077, 13023511, 15722188, 0, 12728814, 0]
[12532173, 0, 0, 12254025, 12406768, 16276566, 12638446, 16651720, 0, 0]
这些0从哪里来?谢谢
最佳答案
Where these 0s come from?
首先,您已在列表中添加了 10 个值为零的项目。
在下面的行中,您将替换随机索引处的值。
Random rnd = new Random();
int hold = rnd.nextInt(10);
while(true){
list.set(hold, list.get(hold)+1);
}
列表中有 8 个线程和 10 个值。现在,对于每个线程,仅生成一次随机数,这意味着在极端情况下,为每个线程生成不同的随机数,列表中仍然有 2 个索引未被替换。
您可以在 while
循环中移动到下面的行后重试,但仍然不能 100% 确定所有索引都被替换。它取决于Random
的行为。
int hold = rnd.nextInt(10);
更多信息请查看Random#nextInt() .
关于Java 线程和同步列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23121390/
我是一名优秀的程序员,十分优秀!