Волокна против потоков: HTreeMap.put()
Я программирую многопоточный сервер, используя волокна из параллельной вселенной:
Главный сайт: http://docs.paralleluniverse.co/quasar/
Волокно: http://docs.paralleluniverse.co/quasar/javadoc/co/paralleluniverse/fibers/Fiber.html
HTreeMap: http://www.mapdb.org/javadoc/latest/mapdb/org/mapdb/HTreeMap.html
Я использую MapDB для реализации брокера сообщений: http://www.mapdb.org/
Каждое волокно должно иметь ссылку на карту / базу данных, предоставленную MapDB, чтобы он мог вызвать метод HTreeMap.put(), чтобы добавить себя на карту, чтобы другие волокна могли использовать HTreeMap.get() и получить ссылку на него. Волокно для маршрутизации сообщений.
Когда я пытаюсь вызвать HTreeMap.put() из любого Fiber, Fiber кажется зависает бесконечно, пытаясь поместить данные в карту. Это либо то, либо само волокно завершается при выполнении функции HTreeMap.put(), а другие потоки в приложении поддерживают его работу (не знаю почему). Если я использую более объемный класс Thread из стандартной Java, он работает без проблем. Мне было интересно, почему это так, и если я делаю что-то не так?
Я не могу позволить себе использовать потоки, так как мне нужно порождать их миллионами, а стандартные потоки Java не так масштабируются.
Это мой класс Брокера:
import aci89.proximity.BrokerID;
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.HTreeMap;
import java.io.File;
import java.util.Date;
public class MessageBroker
{
private DB database;
private DBMaker databaseMaker;
private HTreeMap<String, BrokerID> messageBrokerMap;
public MessageBroker()
{
File databaseFile = new File("MessageBrokerDatabase");
databaseMaker = DBMaker.newFileDB(databaseFile);
database = databaseMaker.make();
messageBrokerMap = database.getHashMap("MessageBrokerDatabase");
}
public void addBrokerID(String emailAddress, BrokerID brokerID)
{
if (!messageBrokerMap.containsKey(emailAddress))
{
messageBrokerMap.put(emailAddress, brokerID);
}
}
public void removeBrokerID(String emailAddress)
{
messageBrokerMap.remove(emailAddress);
System.out.println((new Date()).toString() +
" [INFORMATION] User " +
emailAddress +
" removed their details from the message broker");
}
public BrokerID getBrokerID(String emailAddress)
{
BrokerID brokerID = messageBrokerMap.get(emailAddress);
return brokerID;
}
}
Это мой код, который я выполняю в своем Fiber для добавления в HTreeMap:
BrokerID brokerID = new BrokerID(Fiber.currentFiber(), queue);
messageBroker.addBrokerID(emailAddress, brokerID);
BrokerID - мой пользовательский объект:
package aci89.proximity;
import co.paralleluniverse.fibers.Fiber;
import java.util.Queue;
public class BrokerID
{
private Fiber fiber;
private Queue queue;
public BrokerID(Fiber fiber, Queue queue)
{
this.fiber = fiber;
this.queue = queue;
}
public Fiber getFiber()
{
return fiber;
}
public Queue getQueue()
{
return queue;
}
}