Eclipse Auto Complete

Pazar, 01 Oca 2012 admin yorum yok

Eclipse
IDE denince benim aklıma gelen ilk editor Visual Studio’ dur. MS’ un kendi ide’ si olduğu için .Net platformu için kod geliştirirken, oldukça geşilmiş kod tamamlama özelliği bulunmaktadır. Hele ki ReSharper eklentisi ile Visual Studio süper bir hal almaktadır. Java tarafında ise en güçlü rakibi bence Intellij IDEA. Ancak ücretli olması ve Eclipse gibi plugin açısından çok zengin olmamasından dolayı pek tercih edilmiyor. Eclipse ise plugin açısından çok zengin ve Market Places gibi avantajı var. Sözü fazla uzatmadan sizde Intellij IDEA veya Visual Studio gibi idelerin sunduğu kod intelli sense özelliğinden yararlanmak istiyorsanız aşağıdaki adımları Eclipse üzerinde uygulamalısınız. Default olarak kod tamamlama özelliği Eclipse ile CTRL+Space tuşu ile gerçekleştiriliyor. Ancak küçük bir hile ile bunu intelli sense’ e çevirebilirsiniz.

Eclipse üzerinden Window-Preferences-Java-Editor-Content Assist seçilir.
s
Açılan pencereden Auto Activation kısmında ;
ss
Auto activation delay (ms) : 0
Auto activation triggers for Java : .(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
set edilir.
Daha sonra Ok seçerek ekranı kapatabilirsiniz. Artık kodunuzu yazarken Eclipse’ in Content Assist özelliğinin Visual Studio’ daki IntelliSense gibi çalıştığını görebilirsiniz.

277 defa okundu. Bu Konuyu Yazdır. Bu Konuyu Yazdır.

Ubuntu JDK Kurulumu

Cuma, 23 Ara 2011 admin yorum yok


Bildiğiniz gibi Ubuntu’ nun herhangi bir versiyonunu kurduğunuzda, lisans kısıtlamalarından dolayı Oracle JDK (Java Development Kit) yerine Open JDK ile kurulu geliyor. Tabi genelde JDK versiyonu güncel versiyondan daha eski oluyor. Ancak bu bizim güncel JDK ‘ i yükleyemeyeceğimiz anlamına gelmez. Oracle sitesinden bugün itibariyle güncel versiyon olan Java SE 7u2 sürümünü buradan indirebilirsiniz. Ubuntu bir debian dağıtımı olduğundan rpm (Red Hat Package Manager) paketini değil tar.gz uzantılı versiyonu indirmelisiniz. İsterseniz tar.gz uzantılı dosyayı indirdiğimiz dizine gidelim ve terminal’ e geçip komutları yazalım.

$ tar -xvf jdk-7u2-linux-i586.tar.gz
$ sudo mv jdk1.7.0_02/ /usr/lib/jvm/
$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0_02/jre/bin/java" 1
$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.7.0_02/jre/javac" 1
$ sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.7.0_02/jre/bin/javaws" 1
$ sudo update-alternatives --config java

Sırası ile terminale kodları girdikten sonra sistemimizde bulunan jdk versiyonlarına göre şuna benzer bir çıktı almalıyız.

There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                      Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      auto mode
  1            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      manual mode
  2            /usr/lib/jvm/jdk1.7.0_02/jre/bin/java      1         manual mode

Press enter to keep the current choice[*], or type selection number:

Benim makinamda 2 numarayı seçerek sisteme jdk 1.7.0_02 sürümünü set ediyoruz.
Daha sonra tekrar terminalden

$ java -version

komutunu girerek sistemde seçili olan java versiyonunu listeliyoruz. Komut satırının çıktısı aşağıdaki gibiyse eğer güncel JDK başarılı bir şekilde kuruldu demektir.

java version "1.7.0_02"
Java(TM) SE Runtime Environment (build 1.7.0_02-b13)
Java HotSpot(TM) Server VM (build 22.0-b10, mixed mode)
300 defa okundu. Bu Konuyu Yazdır. Bu Konuyu Yazdır.

Android Lcd Tester

Pazar, 27 Kas 2011 admin yorum yok

Android
Android işletim sistemine sahip telefonlar için geliştirdiğim lcd test uygulaması. Uygulama içerisinde çeşitli test image’ ları ile telefonunuzun ekranını test edebilir, ölü piksel (dead pixel) veya sıkışmış piksel (stuck pixel) tespiti yapabilirsiniz. Uygulama ücretsiz olup Android Market üzerinden yükleyebilirsiniz.

Available in Android Market

QR Code :
QrDroid
ss00 ss01 ss02

192 defa okundu. Bu Konuyu Yazdır. Bu Konuyu Yazdır.

SuperPi for Android

Pazar, 20 Kas 2011 admin yorum yok

Android
Android işletim sistemine sahip telefonlar için geliştirdiğim benchmark uygulaması. Uygulama ile telefon işlemcisine Gauss-Legendre Algoritması kullanılarak, pi sayısının istenilen sayı kadar digitleri hesaplandırılıyor. Zaten overclock ile uğraşanlar PC için olan versiyonuna aşinadırlar. Uygulamanın kaynak kodlarına SVN‘ den ulaşabilir veya android marketten uygulamanın kendisini indirebilrsiniz.

Available in Android Market

QR Code :
QrDroid
ss00 ss01

1.728 defa okundu. Bu Konuyu Yazdır. Bu Konuyu Yazdır.

Türk Lirası

Cuma, 11 Kas 2011 admin yorum yok

Android
Java ve Android SDK kullanılarak oluşturduğum, güncel döviz ve altın bilgilerini gösteren Android uygulamasını kaynak kodları ile beraber buradan ulaşabilirsiniz. Uygulamada teknoloji olarak XML parsing sax library’ sini kullanmakta. SVN’ den kaynak kodlarına ulaşabilir veya programın kendisini android marketten ulaşabilirsiniz.

Available in Android Market

QR Code :
QrDroid
s00  s01

191 defa okundu. Bu Konuyu Yazdır. Bu Konuyu Yazdır.

Robotic Dance Show

Perşembe, 28 Tem 2011 admin yorum yok

Takip ettiğim blog sitelerinden birinde gördüğüm videoyu sizinle paylaşmak istedim. Gerçekten çok etkileyici bir video bence. Teknolojinin nerelere geldiğini açıkça sergiliyor. İşte robotları yapan Fransa menşeili firma ve videosu.

Categories: Robotic Tags:
525 defa okundu. Bu Konuyu Yazdır. Bu Konuyu Yazdır.

Gerçek Zamanlı İmge İşleme

Çarşamba, 27 Tem 2011 admin 1 yorum


Merhaba arkadaşlar, bu yazımda sizlere Aforge Image Processing Library’ sini kullanarak yaptığım, color tracker programından bahsetmek istiyorum. Genel hatlarıyla konuşmak gerekirse, Sistem web cam üzerinden gelen resim bilgisini alıp istenen bir renk filtresi işlemine tabi tutulduktan sonra geriye kalan nesneleri işaretleme üzerinde çalışmaktadır. Sistemde kullanılan web cam Philips SPC 900NC PC Camera web cam olup, FPS ise 30′ dur. Kameradan gelen frame’ lere dışarıdan bir filltre uygulanmamakta olup, Color Tracker programı tarafından kullanıcının girdiği filtreler uygulanmaktadır. Sonuç olarak işaretlenen nesneler video üzerinde de gösterilmektedir. Ayrıca filtre işlemine tabi tutulmuş frame’ de diğer bir video frame’ de gösterilmektedir.
BLUE TRACKER

RED TRACKER

GREEN TRACKER

288 defa okundu. Bu Konuyu Yazdır. Bu Konuyu Yazdır.

Java Concurency -II

Pazar, 03 Tem 2011 admin yorum yok


Bir önceki yazımda java’da thread ve eş zamanlı programlama konusuna giriş yapmıştım. Bugün’ de java’da threadleri oluşturmak için kullanılan bir framework’ den bahsedeceğim. java.util.Concurent paketinde yer alan Executor interface’ i bizim için threadleri oluşturup yönetebilir. Yine aynı pakette yer alan ExecutorService interface’ i ise Executor interface’ ini extend etmiş ve executor sınıfını yönetmek içerisine bazı yararlı metodlar eklemiştir. ExecutorService interface’ ini oluşturmak için Executors sınıfının statik metodlarını kullanabiliriz. Sözü fazla uzatmadan kodlara geçmek istiyorum;

package net.bsayiner.ExecutorSample;

import java.util.Random;

public class PrintWorker implements Runnable {

	private String taskName;
	private int sleepTime;
	private Random random = new Random();

	public PrintWorker(String taskName) {
		this.taskName = taskName;
		this.sleepTime = random.nextInt(5000);
	}

	@Override
	public void run() {
		System.out.format("Thread number: %s Thread name: %s Started%n", Thread
				.currentThread().getId(), taskName);
		try {
			Thread.sleep(sleepTime);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.format("Thread number: %s Thread name: %s Terminated Sleep Time: %s%n",
				Thread.currentThread().getId(), taskName,sleepTime);
	} // End of Imlemented Method run()

} // End of Class PrintWorker

PrintWorker.class
Şimdide ExecutorService nesnemizi barındıran ve bu nesnenin execute metodunu çağıran main metodumuzu yazalım.

package net.bsayiner.ExecutorSample;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Driver {

	public static void main(String[] args) {
		System.out.println("Main thread started");
		PrintWorker printWorker1 = new PrintWorker("PrintWorker 1");
		PrintWorker printWorker2 = new PrintWorker("PrintWorker 2");
		PrintWorker printWorker3 = new PrintWorker("PrintWorker 3");

		ExecutorService executor = Executors.newCachedThreadPool();
		executor.execute(printWorker1);
		executor.execute(printWorker2);
		executor.execute(printWorker3);
		executor.shutdown();

		System.out.println("Main thread terminated");
	}
} // End of Class Driver

Driver.class
Aslında ExecutorService sınıfı ile concurent programlamanın, manuel thread oluşturularak programlama ile pek bit farkı yok. Ancak Executor nesne bizim yerimiz thread pool’ dan gerekli thread’leri üreterek programın daha performanslı çalışmasını sağlıyor. son olarak aşağıda yer alan Thread’ lerin yaşam saykılına bakalım.
Thread LifeCycle

Categories: Java Tags: , ,
181 defa okundu. Bu Konuyu Yazdır. Bu Konuyu Yazdır.

Java Concurency -I

Pazar, 03 Tem 2011 admin yorum yok


Bugünkü makalemizin konusu java’da eş zamanlı programlama. Peki nedir eş zamanlı programlama? Sizinde tahmin ettiğiniz gibi işlemci tarafından aynı anda iki veya daha fazla işlemin yürütülmesi anlamına geliyor. Peki bir işlemci aynı anda iki işlemi yürütebilir mi? Mesela insan vücudunu düşünürsek aynı anda birden fazla işlem yapabiliyoruz. Ancak bir tane işlemcimiz var. O da beynimiz. Peki biz aynı anda birden fazla işlemi nasıl yapıyoruz? Multithread çalışarak. Yani beynimize birden fazla işlem yaparak bu işlemi gerçekleştiriyoruz. Günümüz işlemcilerinde çekirdek sayısı en az 2 konumunda. Bu yüzden aynı anda iki işlem yaptırmak mantıklı gibi gözüküyor. Peki tek çekirdekli bir işlemci kullanıyor olsaydık durum ne olurdu. O zaman da işletim sistemi bizim için işleri bir sıraya koyarak sanki aynı anda birden fazla işlem yapıyormuş izlenimi verirdi. Yani yapması gereken işleri çok küçük zaman aralıklarına bölerek o işlemleri gerçekleştirirdi. Buna işletim sisteminin quanta zamanı deniyor. Windows işletim sisteminde quanta zamanı 20 ms. Yani işletim sistemi çalıştırdığı her process’ i 20 ms de bir değiştiriyor. Tabi bu zaman aralığı değiştirilebilir. Bazı işlemler hayati önlem taşıyorsa onların önceliği arttırılabilir yada azaltabiliriz. Ayrıca bazı işletim sistemleri var ki bütün bu scheduling işlemlerini kullanıcıya bırakıp gerçek zamanlı işlemler yaptırabiliyor. Bu konulara daha sonra değineceğiz. Konumuza dönecek olursak;
Processes
Java’ da yazdığımız her programa bir process deriz. İşlemci tarafından her program bir process olarak adlandırılır. En azından her programda bir adet process bulunmaktadır. Her process’ in kendi bellek bölgesi ve çalışma zamanı kaynakları bulunmaktadır. İşletim sistemi process’ler arası mesajlaşmayı kendisi ayarlamaktadır. Ve bu iletişime IPC(Inter Process Comminication) denmektedir.
Threads
Process’ler ise thread’lerden oluşmaktadır. Yani işe parçacıklarından. Her process en azından bir adet thread bulundurmaktadır. Bizde bu thread’ a main thread demekteyiz. Main thread javada herhangi bir public sınıfta bulunan public static void main(String[] args) metodu ile başlar. Ve daha sonra yönetim bu thread üzerine geçerek başka thread’lerde yaratılabilir. Bu tür çoklu iş parçacıkları kullanmak işlemci performansını da arttırmaktadır. Java 5.0 ile birlikte java.util.Concurency paketi altında High Level bir çok concureny API’ si gelmiştir. Sırası geldikçe api’ leri inceleyeceğiz. Thread’ler genelde lightweight process ler olarak adlandırılmaktadır. Process yaratılmasından daha kolay ve daha az maliyetlidir. Yaratıldan thread ler çalıştığı process in hafızasını kullanmaktadırlar. Bu yüzden hafıza problemlerini önelemek için threadlerin yönetimi programcı tarafından yapılamktadır. Bunun içinde bir çok yol mevcuttur. Sırasıyla bu metodları inceleyeceğiz.
Thread Nesneleri
Java’ da herşeyin sınıflar ile gerçekleştirildiğini biliyoruz. Bu sebeple thread işlemleride sınıflar kullanılarak yapılmaktadır. Thread ile ilgili sınıflar java.util.Concurency paketi altında bulunmaktadır. Thread oluşturma işlemi 2 şekilde gerçekleştirilebiliriz.
1. Thread’ ler üzerinden tek tek kontrol yapabileceğimiz Thread sınıfını kullanarak.
2. Thread yönetimini Executor nesnesi ile yaparak.
Biz yazımız boyunca ilk metodu kullacağız. Yani threadleri kendimiz oluşturup yönetmeye çalışacağız.
Thread Oluşturma
Thread oluşturma işlemini 2 şekilde gerçekleştirebiliriz.
1. runnable interface’ ini kullanarak. Bu interface bizi run adında bir metod implement etmeye zorlayacaktır.

package net.bsayiner.ThreadSample;

public class HelloRunnable implements Runnable{

	@Override
	public void run() {
		System.out.println("Hello from a thread");
	} // End of Implemented Method run()

} // End of Class HelloRunnable

HelloRunnable.class
Daha sonra main metodu yani main thread içerisinde bir adet Thread nesnesi oluşturarak, yapıcısında runnable interface’inden türeyen HelloRunnable nesnesini veriyoruz.

package net.bsayiner.ThreadSample;

public class Driver {

	public static void main(String[] args) {
		Thread thread = new Thread(new HelloRunnable());
		thread.start();
	} // end of Method main

} // End of Class Driver

Driver.class
Dikkat ederseniz burada thread nesnesi oluşturulduktan sonra thread.start() metodu ile thread başlatılıyor.
2. Bu yöntem ise Thread sınıfını extend ederek run metodu override etmek olacak.

package net.bsayiner.ThreadSample;

public class HelloThread extends Thread{

	@Override
	public void run(){
		System.out.println("Hello from a thread");
	} // End of Extended Method run()

} // End of Class HelloThread

HelloThread.class

package net.bsayiner.ThreadSample;

public class Driver {

	public static void main(String[] args) {
		HelloThread helloThread = new HelloThread();
		helloThread.start();
	} // end of Method main

} // End of Class Driver

Driver.class
Bu şekilde de Thread sınıfını extends ettiğimiz için thread sınıfının run metodunu dışarıdan direk nesne üzerinden çağırabiliyoruz. Peki bu iki yöntemden hangisi tercih edilmeli. Genelde runnable interface’ ini implement etmek daha mantıklı gözüküyor. Çünkü java çoklu kalıtıma izin vermiyor ancak çoklu implementasyonlar gerçekleştirilebiliyor. Burada unutulmaması gereken nokta thread nesneleri yaratıldıktan sonra, thread sınıfının start() metodu çağırılarak thread’ler başlatılmıştır.
Thread’leri Uyutmak
Çalıştırdığımız programlarda bazı thread’leri uyutmak isteyebiliriz. Bunun için kullanacağımız metod Thread sınıfının static bir metodu olan Thread.sleep() olacaktır. sleep metodunun overloaded 2 çeşidi bulunmaktadır. Bunlardan birincisi içerisine milisaniye cinsinden deger alır. Diğeri ise ms değerine ek olarak nanosaniye cinsinden de değer alır. Ancak bu iki zamanında kesinliği JVM tarafından kesin olarak garanti edilemez. Çünkü bu bekleme süreleri işletim sistemi tarafından hesaplanmaktadır.

package net.bsayiner.ThreadSleeping;

public class SleeperClass implements Runnable {

	private String[] message = new String[] { "First message",
			"Second message", "Third message", "Fourth message" };

	@Override
	public void run() {
		System.out.println("Messages is writing");
		for (int i = 0; i < message.length; i++) {
			System.out.println(message[i]);
			try {
				Thread.sleep(2000); // Thread 2 sn uyutuluyor
			} catch (InterruptedException e) {
				e.printStackTrace();
			} // End of Try
		} // End of For Loop
	} // End of Implemented Method run()

} // End of Class SleeperClass

SleeperClass.class
Yukarıdaki kodlara dikkat ederseniz Thread.sleep() metodu bir InterruptedException hatası fırlatıyor. Sebebi ise thread uyuyor iken dışarıdan bir interrupt isteği gelebilir. Ve bu anda InterruptedException istisnası fırlatılabilir.

package net.bsayiner.ThreadSleeping;

public class Driver {

	public static void main(String[] args) {
		Thread sleeperThread = new Thread(new SleeperClass());
		sleeperThread.start();
	} // End of Method main

} // End of Class Driver

Driver.class
main metodumuzun içerisinde SleeperThread sınıfında bir instance alınarak Thread nesnesine parametre olarak verilmekte ve thread nesnesinin start metodu ile birlikte ayrı bir thread açılarak işlemler yaptırılmaktadır.
Interrupts
Interrupt kelimesinin türkçe karşılığı Kesme İsteği‘ dir. Microişlemcilerde sıkça kullanılmaktadır. Bilgisayar programcılığında ise interrupt çalışan bir thread’ in yaptığı işi derhal bırakıp interrupt istediği geldiğinde yapılacak işlemleri yapmasıdır. Genelde bu interrupt istedği ile thread sonlandırılır. Ancak bazı durumularda başka işlemler yapılması isteniyor olarabilir. Interrupt uygulamalarının mantıklı olarak çalışabilmesi için kesme istedği uygulanan thread içerisinde, kesme uygulandığında yapılacak işlemler belirtilmelidir. Peki thread nesnleleri kendi interrupt olaylarını nasıl tanımlayacaklar. Eğer thread içerisinde bir döngü varsa ve işlemler bu döngü içerisinde yapılıyorsa, InterruptedException burada fırlatılabilir. İsterseniz bir örnek ile konuyu pekiştirelim.

package net.bsayiner.InterruptRequest;

public class InterruptedThread implements Runnable {

	private String[] works = new String[] { "First work", "Second work",
			"Third work", "Fourth work" };

	@Override
	public void run() {
		for (int i = 0; i < works.length; i++) {
			System.out.println(works[i]);
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				System.out.println("Method terminated");
				return; // Interrupt isteği gelirse metod' dan çıkılıyor.
			}
		} // End of For Loop
	} // End of Implemented Method run()

} // End of Class InterruptedThread

InterruptedThread.class
Gördüğünüz gibi runnable metodunun çalıştığı thread dışasıran interrupt() metodu ile tetiklenirse InterruptedException istisnası oluşturuluyor catch istisna yakalanıyor ve return ile metoddan çıkılıyor. main metodumuzun bulunduğu sınıf ise şöyle;

package net.bsayiner.InterruptRequest;

public class Driver {

	public static void main(String[] args) {
		Thread thread = new Thread(new InterruptedThread());
		thread.start();
		try {
			Thread.sleep(2200);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} // End of Try
		thread.interrupt();
	} // End of Method main()

} // End of Class Driver

Driver.class
Yukarıda verdiğimiz örneklerde Thread.sleep ile bir InterruptedException yakalamış ve buna gore programımızı yönlendirmiştik. Peki programımızda bir sleep kullanmayacaksak ve run metodumuzun çalıştığı thread’ in bir interrupt alıp almadığını nasıl anlayacağız. Bunu için yine bir döngü içerisinde Thread sınıfının static bir metodu olan Thread.interrupt() metodunu kullanabiliriz. Hemen kodlara göz atalım;

package net.bsayiner.ThreadInterrupted;

public class ThreadInterrupted implements Runnable {

	private String[] works = new String[] { "First work", "Second work",
			"Third work", "Fourth work" };

	@Override
	public void run() {
		System.out.println("Thread started");
		for (int i = 0; i < works.length; i++) {
			System.out.println(works[i]);
			if (Thread.interrupted()) { // Thread interrupt edilmişmi kontrol ediliyor.
				System.out.println("Thread terminated");
				return;
			} // End of If Case
		} // End of For Loop
	} // End of Implemented Method run()

} // End of Class ThreadInterrupted

ThreadInterrupted.class

package net.bsayiner.ThreadInterrupted;

public class Driver {

	public static void main(String[] args) {
		Thread thread = new Thread(new ThreadInterrupted());
		thread.start();
		thread.interrupt(); // thread interrupt ediliyor
	} // End of Method main()

} // End of Class Driver

Driver.class
Yukarıdaki örnekte run metodunun içerisinde Thread.sleep gibi bir checked exception fırlatan metod kullanılmadığı için, for döngüsü içerisinde if ile Thread.interrupted() metodu kullanılarak thread durumu kontrol ediliyor. Ancak burada çok önemli bir durum söz konusu. Thread.interrupted() metodu çağrıldığında interrupt flag temizlenir. Çünkü bir interrupt oluştuğunda interrupt flag’ ı true olur. Biz Thread.interrupt() metodu ile bu flag’ i resetleyerek tekrardan false yaparız. Bu durum unutulmamalıdır. Interrupt durumunu kontrol etmek için kullanılan ve statik olamaya isInterrupted metodu ise, başka bir thread tarafından kontrol edilir ve kontrol edilen thread üzerinde bir interrupt varsa yapılacak işlemler kontrolu yapan thread nesnesi bünyesinde olur. Statşk olmayan isInterrupted() metodu Interrupt flag’ ini temizlemez sadece okur.
Join
Join metodu ile birden fazla thread çalışıyorsa bu thread’lerin birbirlerini beklemesi için kullanılabilir. Mesela bir thread üzerinden çalışan metodumuz çok uzun bir işlem yapıyor olabilir. Veya bir timeout değeri ile işlemin timeout suresinden uzun surmesi durumunda thread sonlandırılabilir. Join metodu bit thread üzerinden çağrıldığında bu metodu çağıran metod thread sonlanıncaya kara bloklanır. Join metodunun overloaded versiyonları ike bekleme zamanı belirlenebilir. Aynı sleep metodunda olduğu gibi join metoduda checked exception istisnası olan InterruptException istisnasını fırlatır.

package net.bsayiner.JoinSample;

public class JoinedClass implements Runnable {

	private String[] works = new String[] { "First work", "Second work",
			"Third work", "Fourth work" };

	@Override
	public void run() {
		long threadID = Thread.currentThread().getId(); // Çalışan thread numarası alınıyor.
		System.out.format("Thread id : %s started.%n", threadID); // Ekrana thread numarası yazılıyor.
		for (int i = 0; i < works.length; i++) {
			System.out.println(works[i]);
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			} // End of Try
		} // End of For Loop
		System.out.format("Thread id : %s terminated.%n", threadID); // Ekrana thread numarası yazılıyor.
	} // End of Implemented Method run

} // End of Class JoinedClass

JoinedClass.class

package net.bsayiner.JoinSample;

public class Driver {

	public static void main(String[] args) {
		long threadID = Thread.currentThread().getId(); // Çalışan thread numarası alınıyor.
		System.out.format("Thread id : %s started.%n", threadID); // Ekrana thread numarası yazılıyor.
		Thread thread = new Thread(new JoinedClass());
		thread.start();
		try {
			thread.join(); // JoinedClass işini bitirene kadar main thread bloklanıyor.
		} catch (InterruptedException e) {
			e.printStackTrace();
		} // End of try
		System.out.format("Thread id : %s terminated.%n", threadID); // Ekrana thread numarası yazılıyor.
	} // End of Method main()

} // End of Class Driver

Driver.class
Yukarıdaki Driver.class main metodunda görüldüğü üzere oluşturulan thread üzerinden join metodu çağırılarak , oluşturulan thread’ in işi bitene kadar program bloklanıyor. Aynı sleep metodunda olduğu gibi program bloklandığında dışarıdan bir interrupt istedği gelirse InterruptedException oluşuyor. main metodunda Thread sınıfının static Thread.currentThread() metodu ile o anda çalışmakta olan güncel thread’ in thread numarasını görüyoruz. İsterseniz buraya kadar gördüğümüz konuları pekiştirmek adına bir program yazalım. Bu programda iki tane thread’ imiz olsun. Worker thread ekrana bazı mesajlar yazsın. Main thread’ de belirli bir zaman kadar worker thread’ in işini bitirmesini beklesin. Ancak belilenen timeOut süresi kadar thread işini bitirmezse worker thread sonlandırılsın. Kodlarımız şöyle olacaktır;

package net.bsayiner.TimeOutSample;

public class WorkerClass implements Runnable{

	private String[] works = new String[] { "First work", "Second work",
			"Third work", "Fourth work" };

	@Override
	public void run() {
		long threadID = Thread.currentThread().getId(); // Çalışan thread numarası alınıyor.
		System.out.format("Thread id : %s started.%n", threadID); // Ekrana thread numarası yazılıyor.
		for (int i = 0; i < works.length; i++) {
			System.out.println(works[i]);
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				System.out.println("Thread isn't finish job");
				System.out.format("Thread id : %s started.%n", threadID); // Ekrana thread numarası yazılıyor.
				return;
			} // End of Try
		} // End of For Loop
		System.out.format("Thread id : %s started.%n", threadID); // Ekrana thread numarası yazılıyor.
	} // End of Implemented Method Run()

} // End of Class WorkerClas

WorkerClas.class

package net.bsayiner.TimeOutSample;

public class Driver {

	public static void main(String[] args) {
		// Çalışan thread numarası alınıyor.
		long threadID = Thread.currentThread().getId();
		// Ekrana thread numarası yazılıyor.
		System.out.format("Thread id : %s started.%n", threadID);
		// Programın baslama anındaki zaman.
		long startTime = System.currentTimeMillis();
		// ms cinsinden timeOut zamanı.
		long timeOut = 2000;
		Thread thread = new Thread(new WorkerClass());
		thread.start();
		while (thread.isAlive()) {
			try {
				// Worker thread 100ms bekleniyor.
				thread.join(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			} // End of Try
			if ((System.currentTimeMillis() - startTime > timeOut)
					&& thread.isAlive()) {
				thread.interrupt();
			}
		} // End of While Loop
			// Ekrana thread numarası yazılıyor.
		System.out.format("Thread id : %s terminated.%n", threadID);
	} // End of Method main()

} // End of Class Driver

Driver.class
timeOut değişkenindeki değer değiştirilerek bekleme süresi arttırılıp azalttırılabilir.
Sonucç olarak bu yazımızda Java’ da eş zamanlı programlamaya bir giriş yapmış olduk. Konumuzun devamında görüşmek üzere.

288 defa okundu. Bu Konuyu Yazdır. Bu Konuyu Yazdır.

Java String Sınıfı

Çarşamba, 22 Haz 2011 admin yorum yok


Merhaba arkadaşlar. Bugünkü yazımızın konusu, Java da String işlemleri ve String sınıfının bazı metodları olacaktır. Bildiğiniz gibi Java’ da karakter sabitleri aslında birer integer değerdir. Yani JVM tarafında karakterler birer sayı, unicode karakter olarak tanımlamaktadır. Bahsettiğimiz karakter sabitlerinin bir araya gelmesiyle String dediğimiz veri yapısı oluşmaktadır. Yani char tiplerini harf olarak düşündüğümüzde, harfler bir araya gelerek bir kelime yani String tipinde nesneler oluşturmaktadır. String tiplerinin bir başka özelliğide immutable yani değiştirilemez olmasıdır. Yani siz bir string tipi üzeriden işlemler yaptığınız zaman aslına o işlem sonucu, işlem yapılan string nesnesine yansıtılmaz. Bunun yerine yeni bir string nesnesi oluşturulur. Bu yüzden string’ ler üzerinde çok fazla işlem yapan (kelime işlmeci uygulamaları gibi) uygulamalarda StringBuilder sınıfı tercih edilmelidir. Daha sonraki yazımda da bu sınıftan bahsetmeye çalışacağım. Tekrar String sınıfına dönecek olursak Java’ da basit olarak string tipinden bir değişken oluşturmak için aşağıdaki kod yeterli olacaktır.

String kelime="Merhaba Dunya";

Bu tanımlamadan başka string tipinde bir nesneyi, String sınıfının yapıcı metodlarına istedikleri parametreleri vererekte oluşturabilir. Aşağıdaki kodu inceleyelim;

package net.bsayiner.StringSamples;

public class Driver {

	public static void main(String[] args) {
		char[] charArray = new char[] { 'm', 'e', 'r', 'h', 'a', 'b', 'a' };
		String s1 = new String(); // İçerisinde birşey olmayan boş bir string
									// nesnesi.
		String s2 = new String(charArray); // İçerisine char array alan yapıcı
											// metod.
		String s3 = new String("Merhaba Dunya"); // İçerisine istediğimiz
													// string' i yazabildiğimiz
													// yapıcı metod
		String s4 = new String(charArray, 3, 4); //
		System.out.println(s1);
		System.out.println(s2);
		System.out.println(s3);
		System.out.println(s4);
	} // End of method main
} // End of class Driver

Yukarıdaki açıklamalarda da görüldüğü gibi String sınıfının çeşitli yapıcı metodları ile onlara ilk değerlerini verebiliyoruz. Bu yapıcıların haricinde string sınıfının içerisinde bulunan bazı yararlı metodlardan bahsetmek istiyorum.
int length() Metodu : String değişken içerisindeki karakter sayısını döndürür.
char charAt(int index) Metodu : Verilen index numarasında göre değişken içerisindeki karakteri döndürür.
boolean equals(Object anObject)Metodu : İki nesneyi değer açısında birbirleri ile karşılatırır. Object sınıfında bulunduğu için java’ daki tüm nesnelerde bu metod mevcuttur.Primitive tipler hariç, diğer nesneler == operatörü ile karşılaştırma yapılırsa, bu iki değişken aynı nesnenin referansımıdır diye karşılaştırılır. Bu sebeple değer olarak yapılacak karşılaştırmalarda equals metodu tercih edilmelir.
boolean equalsIgnoreCase(String anotherString)
Metodu
: İki string değişkeni birbiri ile karşılaştırır. equal metodundan farkı karşılaştırma yaparken büyük/küçük harf farklılıklarını dikkate almaz.
int compareTo(String anotherString) Metodu : İki string değişkeni birbiri ile karşılaştırır. İkisi eşitse 0, metodun çağrıldığı nesne diğerinden büyükse +1, küçükse -1 geri döndürülür. Burada karşılaştırma işlemi lexicographically yani sözcüksel olarak yapılır. Yazımızın en başında Stringlerin aslında birer karakter dizisi olduğunu ve karakterlerin jvm tarafından int değerler olarak ifade edildiğinden bahsetmiştim. Bu sebeple buradaki karşılaştırma işlemi nümerik olarak yapılmaktadır.
boolean regionMatches(int toffset, String other, int ooffset, int len) Metodu : Bir String nesnesi içerisinde verilen index numarasına göre diğer bir string değeri arar.
boolean startsWith(String prefix) Metodu : String değişkenin verilen prefix değeri ile başlayıp başlamadığını denetler.
boolean endsWith(String suffix) Metodu : String değişkenin verilen suffix değeri ile bitip bitmediğini denetler.
int indexOf(int ch) Metodu : Verilen karakter string değişken içerisinde bulunursa, ilk bulunduğu yerin indexini geri döndürür, eğer bulunamaz ise geriye -1 döndürür. Dikkat ederseniz parametre olarak int karakter almaktadır. Ancak char tipinde bir karakter verdiğimizde compiler otomatik olarak o char değerinin integer karşılığını metoda gönderir.
int lastIndexOf(int ch) Metodu : Verilen karakter string değişken içerisinde bulunursa, en son bulunduğu yerin indexini geri döndürür, eğer bulunamaz ise geriye -1 döndürür.
String substring(int beginIndex) Metodu : Verilen index numarasından itibaren, yeni bir string geri döndürülür. Hatırlayacağınız gibi string bir değişken üzerinde yapılan işlemler, bu değişkeni etkilemez. Yani String tipler değiştirilemez immutable tiplerdir.
String concat(String str) Metodu : İki String nesnesini birleştirmek için kullanılır. + operatörünün yaptığı işlemin aynısını yapar. Yeni oluşturulan string nesnesi geri döndürülür.
String replace(char oldChar, char newChar) Metodu : Bir string nesnesi içerisinde verilen ilk karakter görüldüğü yerde verilen ikinci karakter ile değiştirilir.
String toUpperCase() Metodu : String değişken içerisindeki tüm harfler büyük harfleri ile değiştirilir.
String toLowerCase() Metodu : String değişken içerisindeki tüm harfler küçük harfleri ile değiştirilir.
String trim() Metodu : String değişkenin başındaki ve sonundaki whitespace karakterleri kaldırıp yeni bit string nesnesi geri döndürür.
char[] toCharArray() Metodu : String değişkeni char dizisi tipinde geri döndürür.
String String.valueOf(Object o) Metodu : Bildiğiniz gibi javada tüm sınıflar Object sınıfından türediği için toString metodunu barındırmaktadır. Ancak aynı şey primitive tiplerde geçerli değildir. Çünkü pirimitive tipler object sınıfında türememişlerdir. Onlar value type dediğimiz değer tipleridir ve belleğin stack dediğimiz kısmında yer alır. Peki biz bir primitive tipi nasıl string bir tipe çevirebiliriz. Bunun için Sting sınıfı içerisindeki valueOf metodunu kullanabiriz.

271 defa okundu. Bu Konuyu Yazdır. Bu Konuyu Yazdır.