|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Thread объект к Executor.execute? Такой вызов имел бы смысл? Почему или почему нет? Ответ: Thread реализации Runnable интерфейс, таким образом, можно передать экземпляр Thread к Executor.execute. Однако не имеет смысла использовать Thread объекты этот путь. Если от объекта непосредственно инстанцируют Thread, run метод ничего не делает. Можно определить подкласс Thread с полезным run метод — но такой class реализовал бы опции, которые не будет использовать исполнитель.
Drop class. Решение: java.util.concurrent.BlockingQueue интерфейс определяет a get метод, который блокирует, если очередь пуста, и a put методы, который блокирует, если очередь полна. Они - эффективно те же самые операции, определенные Drop — за исключением того, что Drop не очередь! Однако, есть другой способ смотреть на Отбрасывание: это - очередь с емкостью нуля. С тех пор нет никакой комнаты в очереди ни для каких элементов, каждого get блоки до соответствия take и каждый take блоки до соответствия get. Есть реализация BlockingQueue с точно этим поведением: .
BlockingQueue почти понижение замены для Drop. Основная проблема в
import java.util.Random;
import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable {
private BlockingQueue<String> drop;
public Producer(BlockingQueue<String> drop) {
this.drop = drop;
}
public void run() {
String importantInfo[] = {
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too"
};
Random random = new Random();
try {
for (int i = 0;
i < importantInfo.length;
i++) {
drop.put(importantInfo[i]);
Thread.sleep(random.nextInt(5000));
}
drop.put("DONE");
} catch (InterruptedException e) {}
}
}
Consumer:
import java.util.Random;
import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable {
private BlockingQueue<String> drop;
public Consumer(BlockingQueue<String> drop) {
this.drop = drop;
}
public void run() {
Random random = new Random();
try {
for (String message = drop.take();
! message.equals("DONE");
message = drop.take()) {
System.out.format("MESSAGE RECEIVED: %s%n",
message);
Thread.sleep(random.nextInt(5000));
}
} catch (InterruptedException e) {}
}
}
ProducerConsumerExample, мы просто изменяем объявление для drop объект:
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
public class ProducerConsumerExample {
public static void main(String[] args) {
BlockingQueue<String> drop =
new SynchronousQueue<String> ();
(new Thread(new Producer(drop))).start();
(new Thread(new Consumer(drop))).start();
}
}