[英]Trying to figure out threads and Java
我只是在学习一些有关Java线程的知识,我想知道是否有人可以帮助我。
我创建了一个包含10个整数的列表。 我想做的是进入多个线程,在索引0处获取整数,将其打印并删除。 我希望这种情况发生,直到列表中没有更多的数字为止。 到目前为止,这是我的代码。
public class SlothTest implements Runnable{
static ArrayList<Object> test = new ArrayList<>();
static int listSize;
public static void main(String[] args) {
for (int i = 0; i < 10; i++){
test.add(i);
}
SlothTest runner = new SlothTest();
Thread alpha = new Thread(runner);
Thread beta = new Thread(runner);
alpha.setName("Alpha thread");
beta.setName("Beta thread");
alpha.start();
beta.start();
}
@Override
public void run() {
listSize = test.size();
while (listSize > 0){
getLink();
}
}
private synchronized void getLink(){
String threadName = Thread.currentThread().getName();
System.out.println(threadName + " printed " + test.indexOf(listSize - 1));
test.remove(0);
listSize = test.size();
}
}
有人可以帮我指出我做错的所有事情吗,可能很多。
listSize > 0
的测试未正确同步。 当通过线程调用时执行的检查,但后来居然是空的名单可以是非空getLink()
使getLink()
返回boolean
而不是void可能会更容易,其中true
表示列表为空, false
表示不是,那么每个线程都可以继续调用该方法,直到返回false
为止。 你还必须检查列表不是在顶部空getLink()
试图删除一个项目之前。
@Override
public void run() {
while (getLink());
}
private synchronized boolean getLink(){
String threadName = Thread.currentThread().getName();
System.out.println(threadName + " printed " + test.indexOf(test.size() - 1));
if(!test.isEmpty()){
test.remove(0);
}
return !test.isEmpty()
}
没有什么必要使用多线程方法来获取索引0的元素,因为同步自旋锁的性能(几乎)与单线程应用程序相同。 可以读取多个线程,但是只能写入一个线程。
基本问题是您正在做的事情最好由一个线程完成。 JVM处理了这个问题,但允许一个线程锁定该锁,并在其他线程获得机会之前消耗所有元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.