Soru 0) Ekrana adınızı, soy adınızı ve numaranızı bastıran tam bir JAVA kodu yazınız, kodunuzun konsoldan derlenip çalıştırılması komutlarını yazınız. (10 puan)

 

 

Soru 1) Aşağıdaki sorulara birer cümle ile cevap veriniz: (10 puan)

  1. Serileme (Serialisation) nedir?

    Bir nesnenin dizgi (String) haline dönüşmesi ve dosya, ağ vb. gibi ortamlar üzerinde dizgi olarak saklanması / yollanmasıdır.

  2. JAVA’da neden çok işlemli programlama (multi processed programming) bulunmaz?

    JAVA, platform bağımsız bir geliştirme ortamıdır, dolayısıyla JVM isimli sanal bir makine üzerinde çalışır ve bütün JAVA uygulamalarının bu sanal makine içerisinde kalması beklenir. Dolayısıyla yeni bir işlem (process) üretilmesi halinde JVM dışına çıkılacağı için, çoklu görevlerin (multi tasking), lifler (threads) vasıtasıyla çözülmesi mümkündür, ancak çoklu işlem (multiprocess) JAVA dilinde desteklenmez.

  3. JAVA’da çoklu miras (multiple inheritance) nasıl yapılır?

    Arayüzler kullanılarak (interfaces) yapılabilir (örneğin bu sınavdaki 2. soruda hem extends Thread hem de implements Runnable örneğinde olduğu gibi)

  4. Delegasyon (Delegation) ilişkisi nedir?

    Bir sınıfın, diğer bir sınıfa kılıf olması ve yapılan işlemlere aracılık etmesine verilen isimdir. Örneğin kişisel bir muayenehanede yapılan işlemler aslında doktorun yaptığı işlemlerdir.

  5. Oluşum (composition), birliktelik (Association) ve münasebet (aggregation) ilişkileri arasında ne fark vardır?

    Oluşum, birliktelik ve münasebetin genel ismidir. Birliktelik, iki nesneden birinin diğeri içerisinde yaşamasına, münasebet ise bir nesnenin diğerine atıfta bulunarak içermesine verilen isimdir.

Soru 2) Programcı Ali, ekrana sırasıyla A ve B yazdırma için aşağıdaki kodu yazıyor. (örneğin ekranda “ABABABAB” görmek istiyor). Aşağıdaki kodda, lifler (thread) açısından oluşan problemleri/eksikleri tanımlayınız, ve kodu çalışır hale getiriniz. (25 puan)

class A extends Thread{

int x;

public A(int x){

this.x = x;

}

public void run(){

while(true){

while(x==0){

Thread.sleep(100);

}

System.out.print(“A”);

}

}

}

 

class B implements Runnable{

int x;

public B(int x){

this.x = x;

}

public void run(){

while(true){

while(x==0){

Thread.sleep(100);

}

System.out.print(“B”);

}

}

}

public class test{

public static void main(String args[]){

int x=1;

A a = new A(x);

B b = new B(x);

}

}

Tam çözüm aşağıdaki şekildedir:

Dikkat edilecek hususlar:

extends eden sınıf doğrudan start() edilebilirken implements eden sınıf öncelikle Thread’in yapıcı fonksiyonuna (constructor) parametre verilmeli ardından Thread start() edilmelidir.

İki thread arasında ortak bir değişken kullanılarak senkranizasyon yapılabilmesi için paylaşılmış bir değişkene (shared variable) ihtiyaç duyulur. Oysaki yazılan hatalı kodda (yukarda) her sınıf için yeniden bir değişken tanımlanmıştır. Bu durumda iki farklı değişken bulunacak ve birbiri ile ilgisi kalmayacaktır.

Soruda istenilen senkranizasyon sonucunda ABABA şeklinde bir çalışma beklenmektedir. Oysaki soruda x değişkeni öncelikle 1 olarak atanmıştır. Bu değerin 0 olarak başlaması gerekir.

Senkranizasyon için sınıflardan birisi 0 diğeri 1 durumunda çalışmalıdır. Hatalı kodda ikisi de aynı durumda beklemektedir. Bu durum ölümcül kilitlenmedir (deadlock).

Senkranizasyon sonucunda liflerin (threads) tekrar tekrar çalışabilmesi için sırayı diğer life(thread) geçirmesi gerekir. Bu durumda 1 bekleyen lif, işi bittikten sonra 0, 0 bekleyen lif ise işi bittikten sonra 1 bekleyen lifi uyandırmalıdır.

class A extends Thread{
	test x;
	public A(test x){
		this.x = x;
	}
	public void run(){
		while(true){
			while(x.x==1){
			  try{
			      Thread.sleep(100);
			    }catch(Exception e){}
			}
			System.out.print("A");
			x.x=1;
		}
	}
}
class B implements Runnable{
	test x;
	public B(test x){
		this.x = x;
	}
	public void run(){
		while(true){
			while(x.x==0){
			    try{
				Thread.sleep(100);
			    }catch(Exception e){}
			}
			System.out.print("B");
			x.x=0;
		}
	}
}
public class test{
	public int x=0;
	public static void main(String args[]){

		test p = new test();
		A a = new A(p);
		B b = new B(p);
		Thread t = new Thread (b);
		a.start();
		t.start();
	}
}

Soru 3) (35 puan)

  1. Bir metin dosyasını açıp içinden veri okuyunuz.

  2. Okuduğunuz verinin içerisinde email adresi olup olmadığına bakınız (emailler için “@” işaretinden önce istenilen boyutta harf ve sayı karışımı “.” işaretiden önce yine istenilen boyutta harf ve sayı karışımı, “.” İşaretinden sonra ise com, edu, org veya net gelebileceğini kabul edebilirsiniz), şayet bir email’e rastlarsanız kendi yazdığınız bir istisna fırlatınız (throw exception).

  3. Bir önceki şıkta istisna fırlatılması halinde bu email adresini, “Silindi” dizgisi(string) ile değiştiriniz.

 

Dikkat edilecek iki önemli husus, StringTokenizer ve RegularExpression kullanımıdır. Ayrıca istisna yakalama için farklı modeller kullanılabilir, yukarıdaki kodda en basit yol seçilmiştir.

Örnek bir dosya için çıktı aşağıdaki şekildedir:

 

Soru 4) Swing kütüphanesi kullanarak 500×500 boyutunda bir ekran oluşturup tam ortasına isminizi yazdırınız. İsminizin etrafına, isminizi çerçeveleyen bir dikdörtgen çizdiriniz. (20 puan)

 

Yukarıdaki kodun çıktısı aşağıdaki şekildedir:

 

 

Yorumlar

  1. ahmet alp balkan

    Java'da multiprocessing ve interprocess communiction vardir. Bir cok jvm process'i birbirleriyle JMS gibi yontemlerle iletisim kurabilir.

  2. Şadi Evren ŞEKER Article Author

    Evet haklısınız ama JMS gibi paketler J2EE içerisinde yer almaktadır ve bu ders kapsamının dışındadır. Zaten işlem (process) üretmek gibi yöntemlerde ProcessBuilder gibi sınıflar her ortamda doğru çalışmamaktadır, bu da JAVA'nın platform bağımsız yapısı ile çelişmektedir.
    Nitekim JAVA'nın ilk ülkemize girdiği zamanlardan beri CORBA veya daha sonraları microsoft etkisi ile SOAP teknolojileri sizin de bahsettiğiniz üzere JAVA işlemleri (process) arası iletişimi hedefleyen teknolojilerdir. Dersin kapsamı J2SE olduğu için bu teknolojiler göz ardı edilerek soru hazırlanmıştır ve sorudaki amaç, JAVA dilinde, birden fazla görevin aynı anda yapılması istendiğinde, neden öncelikli olarak multithreading (çok lifli) yaklaşımın kullanıldığını sorgulamaktır.

  3. Şadi Evren ŞEKER Article Author

    lifler (threads) ortak değişken kullanırlar (shared variable). Dolayısıyla iki lif arasında veri iletişimi sağlanmak için ortak bir değişken test sınıfının (class) üzerinden taşınmıştır. Aksi halde birbirlerinin durumunu takip edemezler.

    başarılar

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


dört × = 8