Date post: | 13-Jul-2015 |
Category: |
Technology |
Upload: | technopark |
View: | 187 times |
Download: | 1 times |
public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
public final int incrementAndGet() {while (true) {
int current = get(); //get() возвращает текущее значение (volatile)int next = current + 1;if (compareAndSet(current, next))
return next;}
}
public class Address {static private AtomicInteger abonentIdCreator = new AtomicInteger();final private int abonentId;
public Address(){this.abonentId = abonentIdCreator.incrementAndGet();
}
public int hashCode() {return abonentId;
}}
public interface Abonent {Address getAddress();
}
public abstract class Msg {final private Address from;final private Address to;
public Msg(Address from, Address to){this.from = from;this.to = to;
}
protected Address getFrom(){return from;
}
protected Address getTo(){return to;
}
public abstract void exec(Abonent abonent);}
public abstract class MsgToFrontend extends Msg {
public MsgToFrontend(Address from, Address to) {super(from, to);
}
public void exec(Abonent abonent) {if( abonent instanceof Frontend ){
exec((Frontend)abonent);}
}
public abstract void exec(Frontend frontend);}
public class MsgUpdateUserId extends MsgToFrontend {
final private int sessionId;final private int userId;
public GameInfoMsg(Address from, Address to, int sessionId, int userId) {super(from, to);this. sessionId = sessionId;this. userId = userId;
}
public void exec(Frontend frontend) {frontend.updateUserId(sessionId, userId);
}}
Msg
MsgToAS MsgToFrontend
MsgUpdateUserIdMsgGetUserId
- Address from- Address to
- String name
- Integer sessionId
- Integer sessionId
- Integer userId
private Map<Address, ConcurrentLinkedQueue<Msg>> messages = new HashMap<Address, ConcurrentLinkedQueue<Msg>>();
public void sendMessage(Msg message){Queue<Msg> messageQueue = messages.get(message.getTo());messageQueue.add(message);
}
public void execForAbonent(Abonent abonent) {Queue<Msg> messageQueue = messages.get(abonent.getAddress());while(!messageQueue.isEmpty()){
Msg message = messageQueue.poll();message.exec(abonent);
}}
public class AddressService {private Map<Class<?>, Address> addresses = new HashMap<Class<?>, Address>();
public Address getAddress(Class<?> abonentClass) {return addresses.get(abonentClass);
}
public void setAddress(Abonent abonent) {addresses.put(abonent.getClass(), abonent.getAddress());
}}
14. Плюсы и минусы многопоточных приложений
15. Способы взаимодействия потоков
16. java.util.concurrent
17. MessageSystem. Address и Abonent