gpt4 book ai didi

java - 关于阻塞队列和多线程消费者的一些困惑

转载 作者:行者123 更新时间:2023-12-02 03:26:41 24 4
gpt4 key购买 nike

我正在编写一些像这样的多线程代码(由于相关性省略了很多细节):

public class Producer {

private static BlockingQueue<Transaction> transactionsQueue = new LinkedBlockingQueue<Transaction>();
private static ArrayList<C> consumersList = new ArrayList<C>();

public Producer(int a, int b) {
for (int i = 0; i < a; i++)
accountsList.add(new Account(i, DEFAULT_BALANCE));

for (int i = 0; i < b; i++)
consumersList.add(new Consumer());

for (Consumer c : consumersList)
c.start(); //question line of code
}


public class Consumer extends Thread{
@Override
public void run(){
while (true) {
try {
Transaction nextTransaction = transactionsQueue.take();

if(nextTransaction.equals(FINAL_TRANSACTION))
break;

Account acc = accountsList.get(nextTransaction.getTo());
acc.makeTransaction(nextTransaction);
System.out.println(acc);

} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public static void main(String []args){
try{
launch(args[0], NUM_OF_ACCOUNTS, Integer.parseInt(args[1]));
}catch (Exception e){
System.out.println("Incorrect args. Starting with default arguments");
launch(SMALL_FILE, NUM_OF_ACCOUNTS, NUM_OF_THREADS);
}
}

private static void launch(String filename, int numOfAccounts, int numOfConsumers) {
Producer bank = new Producer(numOfAccounts, numOfConsumers);
bank.createTransactionsQueue(filename); //start putting into transactionsQueue
bank.close();
}
}

我的问题是,当程序在 Producer 的构造函数中执行 for (Consumer c :consumersList) c.start(); 时,消费者线程的 run() 方法立即被调用?如果是这样,当 transactionsQueue 为空时会发生什么 - 因为我开始将 put 放入 transactionsQueue at bank.createTransactionsQueue(filename) ; 这是在调用构造函数(并创建消费者线程)之后。

最佳答案

does the consumer threads's run() method immediately gets called

很快就会被调用。它不是执行的下一行,而是在新线程实际启动时执行。

If so what happens when the transactionsQueue is empty

正在运行的其他线程将被挂起,直到队列中有一个元素。对于放置的每个元素,将唤醒一个线程以将元素从队列中拉出。

关于java - 关于阻塞队列和多线程消费者的一些困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38764213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com