繁体   English   中英

试图弄清楚线程和Java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM