のBlockingQueueとマルチスレッドの消費者に関するいくつかの混乱:私はこのようないくつかのマルチスレッドコード(理由は関連性を省略多くの詳細)に取り組んでいます
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();
}
}
私の質問は、プログラムがでfor (Consumer c : consumersList) c.start();
を実行しますProducer
のコンストラクタでは、コンシューマスレッドのrun()
メソッドがすぐに呼び出されますか?もしそうなら、私はtransactionsQueue
が空であるときに何が起こるのですか?をtransactionsQueue
に入れてbank.createTransactionsQueue(filename);
になります。コンストラクタが呼び出された後にコンシューマスレッドが作成されます。
Googleが「コンストラクタでこれを漏らしている」という理由で、オブジェクトのコンストラクタ内からスレッドを開始するのが悪い考えを知りました。 –
あなたは[このスレッドを開始する方法](http://stackoverflow.com/questions/5623285/why-not-to-start-a-thread-in-the-constructor-how-to-terminate)を参照していますか?しかし、私は「this」を参照していない、私のスレッドを開始する方法? – Liumx31
真。私は、コンストラクタ内でスレッドを開始するのは悪い習慣だと言っているだけです。それはいつも間違っているわけではありませんが、それは私自身のコードではしばしば間違っています。私はコードを読んでいる他のプログラマーがスレッドを安全に開始したかどうかを判断しようと時間を無駄にしないようにしたい。 –