multi-thread bir uygulama yazıyor olalım.
klasik ornek; producer-consumer ornegi bu konuda.
producer ürettiği dataları bir pool'a koyar. Orneğimiz için pool bir ArrayList olsun. Consumer üretilen dataları bir şekilde tüketiyor olacak, tükettiğinide listeden silecek. Consumer ve Producer eş zamanlı çalışan iki thread'dir.
Burada consumer ve producer'in listeye eş zamanlı erişimini engellemek lazım. Yoksa senkronizasyon ile ilgili problemler yaşarsın. Listeden consumer işlemek için aldığı datayı silerken Producer data yazmaya çalışırsa (emin değilim ama) IndexOutOfBounds exception yersin(yada onun gibi bir exception).
Bu durumda(ve benzer durumlarda) yapılması gereken pool'a erişen her bir thread'in sıralı erişimini sağlamaktır. Bunu için genel yöntem pool'a erişim için bir helper class yazmak ve pool'a erişen metodları(veya blokları) synchronized anahtar kelimesi ile marklamaktır. Şöyleki;
<code>
public class PoolHelper {
private LinkedHashMap<String, Command> pool= new LinkedHashMap<String, Command>();
public synchronized void addCommand(Command command) {
pool.put( command.getCommandId(), command );
notifyAll(); //notify for new command
}
protected synchronized Command getLastCommand() {
if( pool.size()>0 ) {
for( Iterator i= pool.keySet().iterator(); i.hasNext(); ) {
String key= (String)i.next();
Command command= pool.get(key);
if( command.isInProcess() ) continue;
if( command.getResendDate()!=null && command.getResendDate().getTime()>System.currentTi meMillis() ) continue;
command.setInProcess( true );
return command;
}
}
try {
wait(1*1000); //wait for new command
}
catch (InterruptedException e) {
}
return null;
}
}
</code>
birde semafor/monitor/lock kavramları var
sen metodu synchronized olarak marklarsan bu o metod'un monitor olarak kullanılacağı anlamına gelir. Bütün metodları instance üzerinden senkronlamanın mantıklı olmadığı durumlarda(bazı metodların/blokların diğer tüm metod ve bloklama senkron olması performans açısından iyi olmayabilir), monitor değişkenleri kullanabilirsin. bunun için metod değil blok synchronized içine alınır. Synchronized blokların, synchronized metodlardan başka detay farklarıda var ama şimdilik boşver.
yukarıdaki ornekte göreceğin gibi wait ve notify/notifyAll yapıları var.
bunlarıda anlamaya çalış.
anlayamadığın yerleri bu başlık altında sorabilirsin.
dilimin dondüğü ve bildiğim kadarı ile yardımcı olmaya çalışırım.
Not: thread'in ne olduğunu anlaman multi-threading'i anlamaya başlamadan once mutlaka doğru olarak anlaman gereken bir şey.
Thread kabaca bir sınıf değil, bir execution order'dir.
Şu linkteki tutorial'i izlemeni oneririm:
http://java.sun.com/docs/books/tutor...rocthread.html
kolaylıklar...