<< index    < bölüm 8           > bölüm 10


9.1 PARALEL KULLANIM(MULTITHREADING)  VE GERÇEK ZAMAN PROGRAMLANMASI 490

9.2 PARALEL PROGRAM KULLANIMIDA HAFIZA SİNKRONİZASYONU .. 495

9.3 ALIŞTIRMALAR


9. PARALEL KULLANIM (MULTITHREADING) , GERÇEK ZAMAN UYGULAMALARI, ANİMASYON

9.1 PARALEL KULLANIM(MULTITHREADING) VE GERÇEK ZAMAN PROGRAMLANMASI

İşlemleri tek tek sırayla ve iyi bir şekilde yapabilseydik belki de çok mükemmel sonuçlar alabilirdik. Fakat Dünyadaki hemen hemen hiçbirşey tek tek sırayla çalışmaz. İnsan vücudu da dahil bir çok doğal sistem paralel olarak çalışır. Yani bir işlem yapılırken parelelinde diğer bir işlem yapılmaya devam eder. Bizim şu anda kullandığımız bilgisayarların büyük bir bölümü tek bir işlemciye(processor) sahiptir. Birden fazla işlemciye sahip paralel bilgisayarlarda, her bir işlemcide bir iş tanımlayarak paralel kullanım mümkündür. Fakat tek işlemcili sistemler için(seri bilgisayar) yazılmış olan program dilleri genel olarak birden fazla işlemin aynı anda yapılmasına izin vermezler. Modern bilgisayar dilleri arasında sadece Ada ve Java dilleri bir işlemcide birden fazla işlemin (programın) aynı anda kullanılmasına izin verir. C++ dili birden fazla programın aynı anda kullanılmasına izin vermez. Bu yüzden tek kullanımlı bir programlama dilidir.

Parelel Kullanım(Multithreading) Tek bir işlemcinin birden fazla program tarafından kullanılmasıdır. Bu kullanım CPU (merkez program işlemcisi) adını verdiğimiz temel bilgisayar işlem ünitesinin çeşitli programlar tarafından ortaklaşa kullanılması prensibine göre yapılır. Bilgisayar CPU zamanı küçük parçalara bölünerek her parçada ayrı bir bilgisayar programının çalışması ve diğer bilgisayar programlarının beklemesi sağlanır. Programlar küçük paketçikler halinde program işlemcisine gönderilir ve sonuçlar tekrar hafızaya aktarılır. Sonra ikinci bir program parçacığı işlemci belleğine gönderilir. Modern seri bilgisayarlarda cache adı verilen bu program parçacıkları çalışırken diğer program parçacıklarını tutabilen hizli hafıza birimleri de bulunur.Tüm bu kontrolları ve birden fazla programın tek işlemcide çalışma işlemini java dilinde doğrudan programlayabiliriz.

CPU nun Parelel kullanımı Runnable interface’i veya abstract Thread sınıfıni kullanarak gerçekleştirilir. Aşağıda Bu iki yolu kullanarak bir digital saat programı oluşturulmuştur. Bu programlarda saat sadece tek bir program olmasına rağmen bilgisayarın belleğinde eğer devamlı çalıştırılacak olursa başka hiçbir programın çalıştırılamıyacağı düşünülerek paralel kullanımlı olarak verilmiştir.

Zaman içinde programları bilgisayarda kontrollu yapıda kullanmak aynı zamanda bize gerçek zaman programlama olasılıklarını da sunar. Paralel ve gerçek zaman kullanımı javayı kuvvetli bir modern programlama dili yapan en önemli özelliklerden biridir.

Program 9.1 Saat.java sınıfının thread sınıfından türemiş olarak yazılımı.

import java.awt.Graphics;
import java.awt.Font;
import java.util.*;
import java.applet.Applet;
import java.text.*;

class saatThread extends Thread
{
Applet a;
public saatThread(Applet ai)
{a=ai;}

public void run()
{
while(true)
{
a.repaint();
try {Thread.sleep
(1000);}
catch(InterruptedException e)
{System.err.println(e.toString());}
}
}
}

public class saat extends Applet
{
Font F;
Date D;
DateFormat df;
Locale tr;
saatThread r;

public void init()
{
F=new Font("TimesRoman",Font.BOLD,24);
tr=new Locale("tr","TR");
D=new Date();
df= DateFormat.getDateInstance(DateFormat.LONG,tr);
r=new saatThread(this);
r.start();
}

public void paint(Graphics g)
{
df.format(D);
D=new Date();
g.setFont(F);
try
{
g.drawString(D.toString(),10,50);
}
catch(NullPointerException e){}
}
}

Program 9.2 SaatSWF.java sınıfının thread sınıfından türemiş olarak yazılımı.

import java.awt.Graphics;

import java.awt.*;

import java.util.*;

import javax.swing.*;

import java.text.*;

class saatThreadSWF extends Thread

{

JFrame a;

public saatThreadSWF(JFrame ai)

{a=ai;}

public void run()

{

while(true)

{

a.validate();

a.repaint();

try {Thread.sleep(1000);}

catch(InterruptedException e)

{System.err.println(e.toString());}

}

}

}

public class saatSWF extends JFrame

{

JLabel jb;

Font F;

Date D;

saatThreadSWF r;

GregorianCalendar takvim;

public saatSWF()

{

super("Digital Saat extends Thread");

Container cc=getContentPane();

jb=new JLabel("");

F=new Font("TimesRoman",Font.BOLD,24);

jb.setFont(F);

// Türkiye standart (Greenwitch zamanına göre iki saat ileride)

String[] ids = TimeZone.getAvailableIDs(+2 * 60 * 60 * 1000);

SimpleTimeZone pdt = new SimpleTimeZone(+2 * 60 * 60 * 1000, ids[0]);

takvim=new GregorianCalendar(pdt);

D=new Date();

takvim.setTime(D);

r=new saatThreadSWF(this);

cc.add(jb);

r.start();

}

public void paint(Graphics g)

{

D=new Date();

takvim.setTime(D);

String s=" ["+

takvim.get(Calendar.DATE) +" / "+

takvim.get(Calendar.MONTH)+" / "+

takvim.get(Calendar.YEAR) +" ] "+

takvim.get(Calendar.HOUR_OF_DAY)+" : "+

takvim.get(Calendar.MINUTE)+" : "+

takvim.get(Calendar.SECOND);

jb.setText(s);

}

public static void main(String[] args)

{

saatSWF pencere= new saatSWF();

pencere.addWindowListener(new BasicWindowMonitor());

pencere.setSize(400,100);

pencere.setVisible(true);

}

}

09001.JPG

Şekil 9.1 saaatSWF.java digital saat JFRame çıktısı

Program 9.3 Saat.java sınıfının Runnable interface’i ile yazılımı ve applet çıktısı

import java.awt.Graphics;
import java.awt.Font;
import java.util.Date;
import java.applet.Applet;

public class saat extends Applet implements Runnable{ Font theFont=new Font("TimesRoman",Font.BOLD,24);

Date theDate;
Thread runner;

public void start()
{
if(runner==null)
{
runner=new Thread(this);
runner.start();
}
}

public void stop()
{
if(runner!=null)
{
runner.stop();
runner=null;
}
}

public void run()
{

while(true)
{
theDate=new Date();
repaint();
try {Thread.sleep(1000);}
catch(InterruptedException e) {}
}
}

public void paint(Graphics g)
{
g.setFont(theFont);
try
{
g.drawString(theDate.toString(),10,50);
}
catch(NullPointerException e){}
}
}

09002.JPG


Şekil 9.2 saat.html appletinde saat theradinin işletilmesi

Program 9.4 saatRunnableSWF sınıfının Runnable interface’i ile yazılımı

import java.awt.Graphics;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.text.*;
public class saatRunnableSWF extends JFrame implements Runnable
{
JLabel jb;
Font F;
Date D;
saatThreadSWF r;
GregorianCalendar takvim;
Thread runner;
public saatRunnableSWF()
{
super("Digital Saat Runnable implement Thread");
Container cc=getContentPane();
jb=new JLabel("");
F=new Font("TimesRoman",Font.BOLD,24);
jb.setFont(F);
// Türkiye standart (Greenwitch zamanına göre iki saat ileride)
String[] ids = TimeZone.getAvailableIDs(+2 * 60 * 60 * 1000);
SimpleTimeZone pdt = new SimpleTimeZone(+2 * 60 * 60 * 1000, ids[0]);
takvim=new GregorianCalendar(pdt);
D=new Date();
takvim.setTime(D);
setBackground(renk.beyaz);
r=new saatThreadSWF(this);
cc.add(jb);
r.start();
}
public void start()
{
if(runner==null)
{
runner=new Thread(this);
runner.start();
}
}
public void run()
{
while(true)
{
repaint();
try {Thread.sleep(1000);}
catch(InterruptedException e)
{System.err.println(e.toString());}
}
}
public void paint(Graphics g)
{
D=new Date();
takvim.setTime(D);
String s=" ["+
takvim.get(Calendar.DATE) +" / "+
takvim.get(Calendar.MONTH)+" / "+
takvim.get(Calendar.YEAR) +" ] "+
takvim.get(Calendar.HOUR_OF_DAY)+" : "+
takvim.get(Calendar.MINUTE)+" : "+
takvim.get(Calendar.SECOND);
jb.setText(s);
}
public static void main(String[] args)
{
saatRunnableSWF pencere= new saatRunnableSWF();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(400,100);
pencere.setVisible(true);
}
}

Programlardan da görüldüğü gibi thread adı verilen ve bilgisayar belleğinde diğer programlarla beraber çalışmasını istediğimiz program parçacıklarını java programının içinde başlatabiliriz(start), kontrol edebiliriz veya durdurabiliriz(stop). Program parçacığının çalışmadan bekleyeceği sureyi de sleep metotunu kullanarak ayarlıyabiliriz.

9.2 PARALEL PROGRAM KULLANIMIDA HAFIZA SİNKRONİZASYONU

İkinci olarak biraz daha karışık bir örneğe göz atalım. Bu örnekte, iki tane program bilgisayar belleginde aynı anda çalışacaktır. Birinci program ikinci programla ortak olarak kullanılan bir bilgisayar int hafıza noktasına sırasıyla birden ona kadar değişen bir rakam yazacak, ikinci program da aynı noktadan (OrtakHucreden) yazılan değeri okuyacaktır.

Program 9.5 OrtakHucre.java programı

class OrtakHucre{ public static void main(String args[])
{
TutInteger h=new TutInteger();
UretInteger p=new UretInteger(h);
KullanInteger c= new KullanInteger(h);
p.start();
c.start(); }

}

class UretInteger extends Thread
{
private TutInteger pTut;
public UretInteger(TutInteger h)
{
pTut=h;
}

public void run()
{
for(int count=0; count<10; count++)
{
pTut.setOrtakInt(count);
System.out.println("OrtakInteger "+count+" degerini uretti");
try{
sleep( (int) (Math.random()*5000 ) );
}
catch(InterruptedException e)
{
System.err.println("Exeption "+e.toString());
}
}
}
}

class KullanInteger extends Thread
{
private TutInteger cTut;
public KullanInteger(TutInteger h)
{
cTut=h;
}
public void run()
{
int Intdegeri=0;
while (Intdegeri !=9)
{
try{
sleep( (int) (Math.random()*5000));
}
catch(InterruptedException e)
{
System.err.println("Exeption "+e.toString());
}
Intdegeri=cTut.getOrtakInt();
System.out.println("Kullan Integer"+Intdegeri+" degerini okudu");
}
}}

class TutInteger{ private int OrtakInt; public void setOrtakInt(int Intdegeri)
{
OrtakInt=Intdegeri;
}
public int getOrtakInt()
{
return OrtakInt;
}
}

program sonucundaki çıktı :

OrtakInteger 0 degerini uretti
OrtakInteger 1 degerini uretti
OrtakInteger 2 degerini uretti
Kullan Integer2 degerini okudu
OrtakInteger 3 degerini uretti
OrtakInteger 4 degerini uretti
OrtakInteger 5 degerini uretti
Kullan Integer5 degerini okudu
Kullan Integer5 degerini okudu
OrtakInteger 6 degerini uretti
OrtakInteger 7 degerini uretti
Kullan Integer7 degerini okudu
OrtakInteger 8 degerini uretti
OrtakInteger 9 degerini uretti
Kullan Integer9 degerini okudu

Program 9.6 Runnable interface’i ile çalişan OrtakHucreR.java sınıfı

import java.util.*;
import java.awt.*;
import java.io.*;//runnable interfacei kullanarak

class UretInteger implements Runnable
{
private TutInteger pTut;
private Thread thread;

public UretInteger(TutInteger h)
{
pTut=h;
thread = new Thread(this);
thread.start();
}

public void run() {
for(int count=0; count < 10; count++) {
pTut.setOrtakInt(count);
System.out.println("Ortak Integer " + count+" Olarak olusturuldu");
try {
thread.sleep((int)(Math.random()*3000));
}

catch(InterruptedException exception) {
System.err.println("Exception " + exception.toString());
}
}
}
}

class KullanInteger implements Runnable
{
private TutInteger cTut;
private Thread thread;

public KullanInteger(TutInteger h) {
cTut = h;
thread= new Thread(this);
thread.start();
}

public void run() {
int Intdegeri=0;
while(Intdegeri != 9) {
try {
thread.sleep((int)(Math.random()*3000));
}
catch(InterruptedException e) {
System.err.println("Exception " + e.toString());
}
Intdegeri = cTut.getOrtakInt();
System.out.println("Kullan Integer " + Intdegeri+"degerini yakaladi");
}
}
}


class TutInteger {
private int OrtakInt;
public void setOrtakInt(int Intdegeri) {OrtakInt = Intdegeri;}
public int getOrtakInt() { return OrtakInt;}
}

public class OrtakHucreR {
public static void main(String[] args) {
TutInteger h= new TutInteger();
new UretInteger(h);
new KullanInteger(h);
}
}

Program 9.7 Buffer ile uyum sağlanmış OrtakHucreBuf.java sınıfı

import java.awt.*;
import java.applet.Applet;
import java.text.DecimalFormat;

public class OrtakHucreBuf extends Applet
{
private TextArea cikti;

public void init()
{
setLayout(new BorderLayout());
cikti = new TextArea();
add(cikti,BorderLayout.CENTER);
}

public void start()
{
Tutinteger h=new Tutinteger(cikti);
Uretinteger p=new Uretinteger(h);
Consumeinteger c= new Consumeinteger(h);

p.start();
c.start();
}
}

class Uretinteger extends Thread
{
private Tutinteger pTut;
private TextArea cikti;

public Uretinteger(Tutinteger h)
{
pTut=h;
}

public void run()
{
for(int count=0; count<10; count++)
{
pTut.setOrtakint(count);

try{
sleep( (int) (Math.random()*500 ) );
}
catch(InterruptedException e)
{
System.err.println("Hata : "+e.toString());
}
}
}
}

class Consumeinteger extends Thread
{
private Tutinteger cTut;

public Consumeinteger(Tutinteger h)
{
cTut=h;
}

public void run()
{
int intdegeri;

intdegeri=cTut.getOrtakint();

while (intdegeri !=9)
{
try{
sleep( (int) (Math.random()*500));
}
catch(InterruptedException e)
{
System.err.println("Hata "+e.toString());
}
intdegeri=cTut.getOrtakint();

}
}
}

class Tutinteger
{
private int Ortakint[] = {9,9,9,9,9};
private boolean writeable = true;
private boolean okunabilir = false;
private int YerelOku =0, YerelYaz=0;
private TextArea cikti;

public Tutinteger(TextArea out)
{
cikti = out;
}

public synchronized void setOrtakint(int intdegeri)
{
while (!writeable)
{
try{

cikti.append(" Beklemede "+intdegeri);
wait();
}
catch (InterruptedException e)
{
System.err.println("Hata :"+e.toString() );
}
}

Ortakint[YerelYaz]=intdegeri;
okunabilir = true;
cikti.append("\n Uretilen "+intdegeri+" Yazilan "+YerelYaz);
YerelYaz = ++YerelYaz % 5;

cikti.append("\t yazilan hucre "+YerelYaz+"\t okunan hucre "+YerelOku);

printBuffer(cikti, Ortakint);

if(YerelYaz==YerelOku)
{
writeable=false;
cikti.append("\nDEPOLAMA YERLER˜ DOLU ");
}
notify();
}

public synchronized int getOrtakint()
{
int intdegeri;
while (!okunabilir)
{
try{
cikti.append(" KULLANMAK iCiN BEKLiYOR ");
wait();
}
catch (InterruptedException e)
{
System.err.println("hata:"+e.toString() );
}
}

writeable=true;
intdegeri=Ortakint[YerelOku];

cikti.append("\n Kullanilan "+intdegeri+" Okundugu Hucre "+YerelOku);
YerelOku = ++YerelOku % 5;
cikti.append("\t yazilan h�cre "+YerelYaz+"\t okunan hucre "+YerelOku);

printBuffer(cikti, Ortakint);
if (YerelOku==YerelYaz)
{okunabilir=false;
cikti.append("\niNTEGER DEPOSU BOS");
}

notify();

return intdegeri;
}

public void printBuffer(TextArea out,int buf[])
{
out.append("\t depo: ");
for(int i=0; i<buf.length; i++)
out.append(" "+buf[i]);
}
}

Buffer ile uyum sağlanmış OrtakHucreBuf.java sınıfı çıktısı

Uretilen 0 Yazilan 0 yazilan hucre 1 okunan hucre 0 depo: 0 9 9 9 9
Kullanilan 0 Okundugu Hucre 0 yazilan hucre 1 okunan hucre 1 depo: 0 9 9 9 9
INTEGER DEPOSU BOS
Uretilen 1 Yazilan 1 yazilan hucre 2 okunan hucre 1 depo: 0 1 9 9 9
Kullanilan 1 Okundugu Hucre 1 yazilan hucre 2 okunan hucre 2 depo: 0 1 9 9 9
INTEGER DEPOSU BOS
Uretilen 2 Yazilan 2 yazilan hucre 3 okunan hucre 2 depo: 0 1 2 9 9
Uretilen 3 Yazilan 3 yazilan hucre 4 okunan hucre 2 depo: 0 1 2 3 9
Kullanilan 2 Okundugu Hucre 2 yazilan hucre 4 okunan hucre 3 depo: 0 1 2 3 9
Uretilen 4 Yazilan 4 yazilan hucre 0 okunan hucre 3 depo: 0 1 2 3 4
Kullanilan 3 Okundugu Hucre 3 yazilan hucre 0 okunan hucre 4 depo: 0 1 2 3 4
Uretilen 5 Yazilan 0 yazilan hucre 1 okunan hucre 4 depo: 5 1 2 3 4
Uretilen 6 Yazilan 1 yazilan hucre 2 okunan hucre 4 depo: 5 6 2 3 4
Uretilen 7 Yazilan 2 yazilan hucre 3 okunan hucre 4 depo: 5 6 7 3 4
Kullanilan 4 Okundugu Hucre 4 yazilan hucre 3 okunan hucre 0 depo: 5 6 7 3 4
Kullanilan 5 Okundugu Hucre 0 yazilan hucre 3 okunan hucre 1 depo: 5 6 7 3 4
Uretilen 8 Yazilan 3 yazilan hucre 4 okunan hucre 1 depo: 5 6 7 8 4
Kullanilan 6 Okundugu Hucre 1 yazilan hucre 4 okunan hucre 2 depo: 5 6 7 8 4
Uretilen 9 Yazilan 4 yazilan hucre 0 okunan hucre 2 depo: 5 6 7 8 9
Kullanilan 7 Okundugu Hucre 2 yazilan hucre 0 okunan hucre 3 depo: 5 6 7 8 9
Kullanilan 8 Okundugu Hucre 3 yazilan hucre 0 okunan hucre 4 depo: 5 6 7 8 9
Kullanilan 9 Okundugu Hucre 4 yazilan hucre 0 okunan hucre 0 depo: 5 6 7 8 9
INTEGER DEPOSU BOS

Problem 9.8 Uyum saglanmış OrtakHucreSync.java sınıfı

class OrtakHucreSyn
{
public static void main(String args[])
{
TutInteger h=new TutInteger();
UretInteger p=new UretInteger(h);
KullanInteger c= new KullanInteger(h);

p.start();
c.start();
}
}

class UretInteger extends Thread
{
private TutInteger pTut;

public UretInteger(TutInteger h)
{
pTut=h;
}

public void run()
{
for(int count=0; count<10; count++)
{
pTut.setOrtakInt(count);
System.out.println("UretInteger OrtakInteger degerini"+count+"olarak olusturdu");

try{
sleep( (int) (Math.random()*3000 ) );
}
catch(InterruptedException e)
{
System.err.println("Exeption "+e.toString());
}
}
}
}

class KullanInteger extends Thread
{
private TutInteger cTut;

public KullanInteger(TutInteger h)
{
cTut=h;
}

public void run()
{
int Intedegeri=0;

while (Intedegeri !=9)
{
try{
sleep( (int) (Math.random()*3000));
}
catch(InterruptedException e)
{
System.err.println("Exeption "+e.toString());
}
Intedegeri=cTut.getOrtakInt();
System.out.println("KullanInteger "+Intedegeri+" yakalad�");
}
}
}

class TutInteger
{
private int OrtakInt;
private boolean Yazilabilir = true;

public synchronized void setOrtakInt(int Intedegeri)
{
while (!Yazilabilir)
{
try{
wait();
}
catch (InterruptedException e)
{
System.err.println("Exception:"+e.toString() );
}
}

OrtakInt=Intedegeri;
Yazilabilir=false;
notify();

}

public synchronized int getOrtakInt()
{
while (Yazilabilir)
{
try{
wait();
}
catch (InterruptedException e)
{
System.err.println("Exception:"+e.toString() );
}
}

Yazilabilir=true;
notify();

return OrtakInt;
}
}

Uyum saglanmış OrtakHucreSync.java sınıfı sonuçları

UretInteger OrtakInteger degerini 0 olarak olusturdu
KullanInteger 0 yakaladı
UretInteger OrtakInteger degerini 1 olarak olusturdu
KullanInteger 1 yakaladı
UretInteger OrtakInteger degerini 2 olarak olusturdu
KullanInteger 2 yakaladı
UretInteger OrtakInteger degerini 3 olarak olusturdu
KullanInteger 3 yakaladı
UretInteger OrtakInteger degerini 4 olarak olusturdu
KullanInteger 4 yakaladı
UretInteger OrtakInteger degerini 5 olarak olusturdu
KullanInteger 5 yakaladı
UretInteger OrtakInteger degerini 6 olarak olusturdu
KullanInteger 6 yakaladı
UretInteger OrtakInteger degerini 7 olarak olusturdu
KullanInteger 7 yakaladı
UretInteger OrtakInteger degerini 8 olarak olusturdu
KullanInteger 8 yakaladı
UretInteger OrtakInteger degerini 9 olarak olusturdu
KullanInteger 9 yakaladı

Programlardan da görüleceği gibi UretInteger sınıfı (thread’i) TutInteger sınıfını kullanarak yeni bir integer degeri yaratmakta ve KullanInteger sınıfı da bu değeri ortak hafızadan okumaktadır. Burada orijinal programlarda iki thread’in çalişma sıralarının sırayla gitmamesi problemi çıkmıştır. Bazen UretInteger programı birden fazla çalışmakta bazende KullanInteger programı birden fazla çalışmaktadır. Bunu onlemek için OrtakHucreSync programında TutInteger sınıfının içinde Uyum kontrolü yapılmıştır. boolean yazılabilir değişkenini bir trafik işareti gibi kullanıp UretInteger ve TutInteger threat programlarının sırasıyla işleme girmesi, bu arada diğerinin beklemesi sağlanmıştır. Buradaki zorluk. Bazen bir programın çok fazla bekleyebilmesi olasılığıdır. Bunu engellemek içinde OrtakHucreBuf programında yazmak için bir yerıne beş integer yeri tanımlanmış, ve okutma ve yazma işlemlerinde iki ayrı kontrol boolean deyimi kullanılmıştır.

9.3 ALIŞTIRMALAR

1. daha önce tanımladığımız yildiz.java (problem 6.19) programını da kullanarak burada analog bir saat tanımı yapılmıştır. Analog saat her saniyede bir çalışmakta ve kendini tekrar çizmektedir. Programı inceleyiniz.

Program 9.9 : analogSaat.java programı, yildizCiz2Thread be analogSaat sınıfları programı

import java.applet.Applet;
import java.util.*;
import java.awt.*;
import yildiz;
import polar;
import java.awt.event.*;

class yildizCiz2Thread extends Thread
{
Applet a;
public yildizCiz2Thread(Applet ai)
{
a=ai;
}

public void run()
{
while(true)
{
a.repaint();
try {Thread.sleep(1000);}
catch(InterruptedException e)
{System.err.println(e.toString());}
}
}
} //yıldızciz2Thread sınıfının sonu

public class analogSaat extends Applet
{
yildizCiz2Thread y;
double aci1,aci2,aci3;
Date c;
polar p;
public void init()
{
c=new Date();
p=new polar();
setBackground(renk.beyaz);
aci1=-c.getSeconds()/60.0*Math.PI*2;
aci2=-c.getMinutes()/60.0*Math.PI*2;
aci3=-(c.getHours()%12)/12.0*Math.PI*2+aci2/12.0;
y=new yildizCiz2Thread(this);
y.start();
}

public void paint(Graphics g)
{
try{
g.setColor(renk.camgobegi);
yildiz.fillDaire(g,200,200,170);
g.setColor(renk.mavi);
yildiz.fillAkrep(g,200,200,16,160,aci2,0);
g.setColor(renk.yesil);
yildiz.fillAkrep(g,200,200,8,110,aci3,0);
g.setColor(renk.lacivert);
yildiz.fillAkrep(g,200,200,10,60,aci1,0);
g.setColor(renk.siyah);
yildiz.drawDaire(g,200,200,165);
yildiz.drawDaire(g,200,200,170);
yildiz.drawAkrep(g,200,200,16,160,aci2,0);
yildiz.drawAkrep(g,200,200,8,110,aci3,0);
yildiz.drawYildiz1(g,200,200,10,60,aci1);
aci1-=Math.PI/30.0;
aci2-=Math.PI/1800.0;
aci3-=Math.PI/21600.0;
for(int i=0;i<12;i++)
{
p.polarGir(165,Math.PI*i/6);
g.setColor(renk.camgobegi);
if(i==0||i==3||i==6||i==9||i==12)
{
yildiz.fillYildiz(g,(int)(p.xi()+200),(int)(200-p.xj()),5,20,0);
g.setColor(renk.siyah);
yildiz.drawYildiz1(g,(int)(p.xi()+200),(int)(200-p.xj()),5,20,0);
}
else
{
g.setColor(renk.lacivert);
yildiz.fillYildiz(g,(int)(p.xi()+200),(int)(200-p.xj()),15,10,0);
//yildiz.drawYildiz1(g,(int)(p.xi()+200),(int)(200-p.xj()),15,10,0);

}
}

}
catch(NullPointerException e){}
}

}

09003.JPG

Şekil 9.3 analogSaat.html appleti

Aynı programın Swing JFrame versiyonu :

Program 9.10 : analogSaatSWF.java JFrame programı, analog saati swing Frame olarak tanımlar

import javax.swing.*;
import java.util.*;
import java.awt.*;
import yildizSW;
import polar;
import java.awt.event.*;

class yildizCiz2ThreadSWF extends Thread
{
JFrame a;
public yildizCiz2ThreadSWF(JFrame ai)
{a=ai;}

public void run()
{
while(true)
{
a.repaint();
try {Thread.sleep(1000);}
catch(InterruptedException e)
{System.err.println(e.toString());}
}
}
} //yıldızciz2Thread sınıfının sonu

public class analogSaatSWF extends JFrame
{
yildizCiz2ThreadSWF y;
double aci1,aci2,aci3;
Date c;
polar p;
public analogSaatSWF()
{
super("Analog Saat");
c=new Date();
// Türkiye standart (Greenwitch zamanına göre iki saat ileride)
String[] ids = TimeZone.getAvailableIDs(+2 * 60 * 60 * 1000);
if (ids.length == 0)
System.exit(0);
SimpleTimeZone pdt = new SimpleTimeZone(+2 * 60 * 60 * 1000, ids[0]);
GregorianCalendar takvim=new GregorianCalendar(pdt);
takvim.setTime(c);
p=new polar();
setBackground(renk.beyaz);
aci1=-takvim.get(Calendar.SECOND)/60.0*Math.PI*2;
aci2=-takvim.get(Calendar.MINUTE)/60.0*Math.PI*2;
aci3=-((takvim.get(Calendar.HOUR))%12)/12.0*Math.PI*2+aci2/12.0;
y=new yildizCiz2ThreadSWF(this);
y.start();
}

public void paint(Graphics g)
{
try{
g.setColor(renk.camgobegi);
yildizSW.fillDaire(g,200,200,170);
g.setColor(renk.mavi);
yildizSW.fillAkrep(g,200,200,16,160,aci2,0);
g.setColor(renk.yesil);
yildizSW.fillAkrep(g,200,200,8,110,aci3,0);
g.setColor(renk.lacivert);
yildizSW.fillAkrep(g,200,200,10,60,aci1,0);
g.setColor(renk.siyah);
yildizSW.drawDaire(g,200,200,165);
yildizSW.drawDaire(g,200,200,170);
yildizSW.drawAkrep(g,200,200,16,160,aci2,0);
yildizSW.drawAkrep(g,200,200,8,110,aci3,0);
yildizSW.drawYildiz1(g,200,200,10,60,aci1);
aci1-=Math.PI/30.0;
aci2-=Math.PI/1800.0;
aci3-=Math.PI/21600.0;
for(int i=0;i<12;i++)
{
p.polarGir(165,Math.PI*i/6);
g.setColor(renk.camgobegi);
if(i==0||i==3||i==6||i==9||i==12)
{
yildizSW.fillYildiz(g,(int)(p.xi()+200),(int)(200-p.xj()),5,20,0);
g.setColor(renk.siyah);
yildizSW.drawYildiz1(g,(int)(p.xi()+200),(int)(200-p.xj()),5,20,0);
}
else
{
g.setColor(renk.lacivert);
yildizSW.fillYildiz(g,(int)(p.xi()+200),(int)(200-p.xj()),15,10,0);
//yildiz.drawYildiz1(g,(int)(p.xi()+200),(int)(200-p.xj()),15,10,0);
}
}
}
catch(NullPointerException e){}
}
public static void main(String[] args)
{
analogSaatSWF pencere= new analogSaatSWF();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(400,400);
pencere.setVisible(true);
}
}

09004.JPG

Şekil 9.4 analogSaatSWF.java JFrame çıktısı

Aynı programın swing Japplet versiyonu :

Program 9.11 : analogSaatSWA.java JApplet programı, analog saati swing Applet olarak tanımlar
import javax.swing.*;
import java.util.*;
import java.awt.*;
import yildizSW;
import polar;
import java.awt.event.*;
class yildizCiz2ThreadSWA extends Thread
{
JApplet a;
public yildizCiz2ThreadSWA(JApplet ai)
{
a=ai;
}
public void run()
{
while(true)
{
a.repaint();
try {Thread.sleep(1000);}
catch(InterruptedException e)
{System.err.println(e.toString());}
}
}
} //y�ld�zciz2Thread s�n�f�n�n sonu
public class analogSaatSWA extends JApplet
{
yildizCiz2ThreadSWA y;
double aci1,aci2,aci3;
Date c;
polar p;
public void init()
{
// Türkiye standart (Greenwitch zamanına göre iki saat ileride)
String[] ids = TimeZone.getAvailableIDs(+2 * 60 * 60 * 1000);
if (ids.length == 0)
System.exit(0);
SimpleTimeZone pdt = new SimpleTimeZone(+2 * 60 * 60 * 1000, ids[0]);
GregorianCalendar takvim=new GregorianCalendar(pdt);
c=new Date();
takvim.setTime(c);
p=new polar();
setBackground(renk.beyaz);
aci1=-takvim.get(Calendar.SECOND)/60.0*Math.PI*2;
aci2=-takvim.get(Calendar.MINUTE)/60.0*Math.PI*2;
aci3=-((takvim.get(Calendar.HOUR))%12)/12.0*Math.PI*2+aci2/12.0;
y=new yildizCiz2ThreadSWA(this);
y.start();
}
public void paint(Graphics g)
{
try{
g.setColor(renk.camgobegi);
yildizSW.fillDaire(g,200,200,170);
g.setColor(renk.mavi);
yildizSW.fillAkrep(g,200,200,16,160,aci2,0);
g.setColor(renk.yesil);
yildizSW.fillAkrep(g,200,200,8,110,aci3,0);
g.setColor(renk.lacivert);
yildizSW.fillAkrep(g,200,200,10,60,aci1,0);
g.setColor(renk.siyah);
yildizSW.drawDaire(g,200,200,165);
yildizSW.drawDaire(g,200,200,170);
yildizSW.drawAkrep(g,200,200,16,160,aci2,0);
yildizSW.drawAkrep(g,200,200,8,110,aci3,0);
yildizSW.drawYildiz1(g,200,200,10,60,aci1);
aci1-=Math.PI/30.0;
aci2-=Math.PI/1800.0;
aci3-=Math.PI/21600.0;
for(int i=0;i<12;i++)
{
p.polarGir(165,Math.PI*i/6);
g.setColor(renk.camgobegi);
if(i==0||i==3||i==6||i==9||i==12)
{
yildizSW.fillYildiz(g,(int)(p.xi()+200),(int)(200-p.xj()),5,20,0);
g.setColor(renk.siyah);
yildizSW.drawYildiz1(g,(int)(p.xi()+200),(int)(200-p.xj()),5,20,0);
}
else
{
g.setColor(renk.lacivert);
yildizSW.fillYildiz(g,(int)(p.xi()+200),(int)(200-p.xj()),15,10,0);
//yildiz.drawYildiz1(g,(int)(p.xi()+200),(int)(200-p.xj()),15,10,0);
}
}
}
catch(NullPointerException e){}
}
}

2. trafikIsigi.java programını inceleyiniz.

Program 9.12 : trafikIsigi.java programı

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

class isikKontroluThread extends Thread
{
Applet a;
public double zaman=12.0;

public isikKontroluThread(Applet ai)
{
a=ai;
}

public void run()
{
while(true)
{
a.repaint();
//12 saniye bekle
try {Thread.sleep((int)(zaman*1000));}
catch(InterruptedException e)
{System.err.println(e.toString());}
}
}

public void setZaman(double zi)
{
zaman=zi;
}

public double getZaman()
{
return zaman;
}

}

public class trafikIsigi extends Applet implements ActionListener
{
isikKontroluThread yik;
private char which_light='y';
private Button light_switch;
private static int x=10;
private static int y= 40;
private static int h=360;
private static int w=100;
private static int radius=40;
private static int hight_diff=30;
TextField t1;
Label l1,l2;
public void init() {

light_switch = new Button("Switch");
light_switch.setForeground(Color.black);
light_switch.setBackground(Color.lightGray);
t1=new TextField("12");
l1=new Label("isik yanma zamani : ");
l2=new Label("saniye");
add(light_switch);
add(l1);
add(t1);
add(l2);
light_switch.addActionListener(this);
t1.addActionListener(this);
yik=new isikKontroluThread(this);
yik.start();
}

public void paint(Graphics g) {
g.setColor(Color.black);
g.fillRect(x,y,w,h);
g.setColor(Color.white);
g.drawRect(x-1,y-1,w+2,h+2);
g.drawRect(x-2,y-2,w+4,h+4);
switch(which_light) {
case 'r':
which_light='g';
g.setColor(Color.lightGray);
g.fillOval(x+10,y+hight_diff,radius*2,radius*2);
g.fillOval(x+10,y+hight_diff*2+radius*2,radius*2,radius*2);
g.setColor(Color.green);
g.fillOval(x+10,y+hight_diff*3+radius*4,radius*2,radius*2);
break;
case 'y':
which_light='r';
g.setColor(Color.lightGray);
g.fillOval(x+10,y+hight_diff*2+radius*2,radius*2,radius*2);
g.fillOval(x+10,y+hight_diff*3+radius*4,radius*2,radius*2);
g.setColor(Color.red);
g.fillOval(x+10,y+hight_diff,radius*2,radius*2);
break;
case 'g':
which_light='y';
g.setColor(Color.lightGray);
g.fillOval(x+10,y+hight_diff,radius*2,radius*2);
g.fillOval(x+10,y+hight_diff*3+radius*4,radius*2,radius*2);
g.setColor(Color.yellow);
g.fillOval(x+10,y+hight_diff*2+radius*2,radius*2,radius*2);
repaint(1000);
}
}

public void actionPerformed(ActionEvent e)
{
if(e.getSource()==light_switch)
{
repaint();
try {Thread.sleep(1000);} catch (Exception exc) {}
}
else if(e.getSource()==t1)
{
Double i1=new Double(t1.getText());
yik.setZaman(i1.doubleValue());
}
}
}

Program 9.13 : trafikIsigiSWP .java JPanel programı, trafik ışığı panelini tanımlar

import javax.swing.*;
import java.awt.*;
import yildizSW;
import java.awt.geom.*;
import renk;
public class trafikIsigiSWP extends JPanel
{
private char which_light='y';
private static int x=10;
private static int y= 40;
private static int h=360;
private static int w=100;
private static int radius=40;
private static int hight_diff=30;
public trafikIsigiSWP()
{
which_light='y';
}
public trafikIsigiSWP(char l)
{
which_light=l;
}
public void setIsik( char l)
{
which_light=l;
}
public char getIsik()
{
return which_light;
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.black);
Rectangle2D dikdortgen1=new Rectangle2D.Double(x,y,w,h);
g2.fill(dikdortgen1);
g2.setColor(Color.white);
Rectangle2D dikdortgen2=new Rectangle2D.Double(x-1,y-1,w+2,h+2);
g2.draw(dikdortgen2);
Rectangle2D dikdortgen3=new Rectangle2D.Double(x-2,y-2,w+4,h+4);
g2.draw(dikdortgen3);
Rectangle2D dikdortgen4=new Rectangle2D.Double(x-4,y-4,w+8,h+8);
g2.setColor(Color.black);
g2.draw(dikdortgen3);
Ellipse2D elips1=new Ellipse2D.Double(x+10,y+hight_diff,radius*2,radius*2);
Ellipse2D elips2=new Ellipse2D.Double(x+10,y+hight_diff*2+radius*2,radius*2,radius*2);
Ellipse2D elips3=new Ellipse2D.Double(x+10,y+hight_diff*3+radius*4,radius*2,radius*2);
switch(which_light) {
case 'r':
which_light='g';
g2.setColor(Color.lightGray);
g2.fill(elips1);
g2.fill(elips2);
g2.setColor(Color.green);
g2.fill(elips3);
break;
case 'y':
which_light='r';
g.setColor(Color.lightGray);
g2.fill(elips2);
g2.fill(elips3);
g2.setColor(Color.red);
g2.fill(elips1);
break;
case 'g':
which_light='y';
g.setColor(Color.lightGray);
g2.fill(elips3);
g2.fill(elips1);
g2.setColor(Color.yellow);
g2.fill(elips2);
break;
//repaint(2000);
}
}
}

Program 9.14 : trafikIsigiSWF .java JFrame programı, trafik ışığı tanımlar ve çalıştırır

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class trafikIsigi1SWF extends JFrame implements ActionListener
{
isikKontroluThread1 yik;
JButton light_switch;
JTextField t1,t2;
JLabel l0,l1,l2,l3,l4;
trafikIsigi1SWP ti1;
Container c;
public trafikIsigi1SWF()
{
c=getContentPane();
JPanel p1=new JPanel();
p1.setLayout(new GridLayout(2,4));
yik=new isikKontroluThread1(this);
yik.start();
ti1=new trafikIsigi1SWP(yik);
light_switch = new JButton("Işığı değiştir");
light_switch.setForeground(Color.black);
light_switch.setBackground(Color.lightGray);
t1=new JTextField(""+yik.getYesilZaman());
t2=new JTextField(""+yik.getKirmiziZaman());
l0=new JLabel(" ");
l1=new JLabel("yesil isik yanma zamani : ");
l2=new JLabel("saniye ");
l3=new JLabel("kirmizi isik yanma zamani : ");
l4=new JLabel("saniye ");
p1.add(light_switch);
p1.add(l1);
p1.add(t1);
p1.add(l2);
p1.add(l0);
p1.add(l3);
p1.add(t2);
p1.add(l4);
light_switch.addActionListener(this);
t1.addActionListener(this);
t2.addActionListener(this);
c.add(p1,BorderLayout.NORTH);
c.add(ti1,BorderLayout.CENTER);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==light_switch)
{
repaint();
}
else if(e.getSource()==t1)
{
Double i1=new Double(t1.getText());
yik.setYesilZaman(i1.doubleValue());
}
else if(e.getSource()==t2)
{
Double i1=new Double(t1.getText());
yik.setKirmiziZaman(i1.doubleValue());
}
}
public static void main(String[] args)
{
trafikIsigi1SWF pencere= new trafikIsigi1SWF();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(300,600);
pencere.setVisible(true);
}
}

09005.JPG


Şekil 9.5 trafikIsigiSWF.java çıktısı

4. H8O1

trafikIsigi programını inceleyiniz. Bu programda yeşil ve kırmızının aynı sürede yandığını göreceksiniz. (sarı 1 saniye yanmaktadır.) Yeşil ve
kırmızının ayrı ayrı sürelerde yanmasını sağlayınız.
Yanma sürelerini TextField alanından kontrol ediniz.

Program 9.15 H8O1.java programı trafik ışığı kontrolu

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

class isikKontroluThread extends Thread
{
Applet a;
public double yesilZaman;
public double kirmiziZaman;
public double sariZaman;
public char hangi_isik;

public isikKontroluThread(Applet ai)
{
a=ai;
yesilZaman=8.0;
kirmiziZaman=4.0;
sariZaman=1.0;
hangi_isik='y';
}

public void run()
{
while(true)
{
try {
if(hangi_isik=='r')
{
Thread.sleep((int)(yesilZaman*1000));
}
else if(hangi_isik=='g')
{
Thread.sleep((int)(sariZaman*1000));
}
else if(hangi_isik=='y')
{
Thread.sleep((int)(kirmiziZaman*1000));
}
a.repaint();
}
catch(InterruptedException e)
{System.err.println(e.toString());}
}
}

public void setYesilZaman(double zi)
{
yesilZaman=zi;
}

public void setKirmiziZaman(double zi)
{
kirmiziZaman=zi;
}

public double getYesilZaman()
{
return yesilZaman;
}

public double getKirmiziZaman()
{
return kirmiziZaman;
}

public char getIsik()
{
return hangi_isik;
}

public void setIsik(char hi)
{
hangi_isik=hi;
}

}

public class H8O1 extends Applet implements ActionListener
{
isikKontroluThread yik;
private Button light_switch;
private static int x=10;
private static int y= 40;
private static int h=360;
private static int w=100;
private static int radius=40;
private static int hight_diff=30;
TextField t1;
TextField t2;
Label l1,l2,l3,l4;
public void init()
{
yik=new isikKontroluThread(this);
yik.start();
light_switch = new Button("Switch");
light_switch.setForeground(Color.black);
light_switch.setBackground(Color.lightGray);
t1=new TextField(""+yik.getYesilZaman());
t2=new TextField(""+yik.getKirmiziZaman());
l1=new Label("yesil isik yanma zamani : ");
l2=new Label("saniye");
l3=new Label("kirmizi isik yanma zamani : ");
l4=new Label("saniye");
add(light_switch);
add(l1);
add(t1);
add(l2);
add(l3);
add(t2);
add(l4);
light_switch.addActionListener(this);
t1.addActionListener(this);
t2.addActionListener(this);
}

public void paint(Graphics g) {
g.setColor(Color.black);
g.fillRect(x,y,w,h);
g.setColor(Color.white);
g.drawRect(x-1,y-1,w+2,h+2);
g.drawRect(x-2,y-2,w+4,h+4);
switch(yik.getIsik()) {
case 'r':
yik.setIsik('g');
g.setColor(Color.lightGray);
g.fillOval(x+10,y+hight_diff,radius*2,radius*2);
g.fillOval(x+10,y+hight_diff*2+radius*2,radius*2,radius*2);
g.setColor(Color.green);
g.fillOval(x+10,y+hight_diff*3+radius*4,radius*2,radius*2);
break;
case 'y':
yik.setIsik('r');
g.setColor(Color.lightGray);
g.fillOval(x+10,y+hight_diff*2+radius*2,radius*2,radius*2);
g.fillOval(x+10,y+hight_diff*3+radius*4,radius*2,radius*2);
g.setColor(Color.red);
g.fillOval(x+10,y+hight_diff,radius*2,radius*2);
break;
case 'g':
yik.setIsik('y');
g.setColor(Color.lightGray);
g.fillOval(x+10,y+hight_diff,radius*2,radius*2);
g.fillOval(x+10,y+hight_diff*3+radius*4,radius*2,radius*2);
g.setColor(Color.yellow);
g.fillOval(x+10,y+hight_diff*2+radius*2,radius*2,radius*2);
break;
}
}

public void actionPerformed(ActionEvent e)
{
if(e.getSource()==t1)
{
Double i1=new Double(t1.getText());
yik.setYesilZaman(i1.doubleValue());
}
else if(e.getSource()==t2)
{
Double i1=new Double(t2.getText());
yik.setKirmiziZaman(i1.doubleValue());
}
else if(e.getSource()==light_switch)
{
repaint();
try {Thread.sleep(1000);} catch (Exception exc) {}
}
}
}

Program 9.16 trafikIsigi1SWP.java, Jpanel trafik ışığı panelleri

import javax.swing.*;
import java.awt.*;
import yildizSW;
import java.awt.geom.*;
import renk;

public class trafikIsigi1SWP extends JPanel
{
private static int x=10;
private static int y= 40;
private static int h=360;
private static int w=100;
private static int radius=40;
private static int hight_diff=30;
private isikKontroluThread1 yik;
public trafikIsigi1SWP(isikKontroluThread1 ikt)
{
yik=ikt;
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.black);
Rectangle2D dikdortgen1=new Rectangle2D.Double(x,y,w,h);
g2.fill(dikdortgen1);
g2.setColor(Color.white);
Rectangle2D dikdortgen2=new Rectangle2D.Double(x-1,y-1,w+2,h+2);
g2.draw(dikdortgen2);
Rectangle2D dikdortgen3=new Rectangle2D.Double(x-2,y-2,w+4,h+4);
g2.draw(dikdortgen3);
Rectangle2D dikdortgen4=new Rectangle2D.Double(x-4,y-4,w+8,h+8);
g2.setColor(Color.black);
g2.draw(dikdortgen3);
Ellipse2D elips1=new Ellipse2D.Double(x+10,y+hight_diff,radius*2,radius*2);
Ellipse2D elips2=new Ellipse2D.Double(x+10,y+hight_diff*2+radius*2,radius*2,radius*2);
Ellipse2D elips3=new Ellipse2D.Double(x+10,y+hight_diff*3+radius*4,radius*2,radius*2);
switch(yik.getIsik()) {
case 'r':
yik.setIsik('g');
g2.setColor(Color.lightGray);
g2.fill(elips1);
g2.fill(elips2);
g2.setColor(Color.green);
g2.fill(elips3);
break;
case 'y':
yik.setIsik('r');
g.setColor(Color.lightGray);
g2.fill(elips2);
g2.fill(elips3);
g2.setColor(Color.red);
g2.fill(elips1);
break;
case 'g':
yik.setIsik('y');
g.setColor(Color.lightGray);
g2.fill(elips3);
g2.fill(elips1);
g2.setColor(Color.yellow);
g2.fill(elips2);
break;
}
}
}

Program 9.17 trafikIsigi1SWF.java, JFrame e trafik ışığı programı

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class trafikIsigi1SWF extends JFrame implements ActionListener
{
isikKontroluThread1 yik;
JButton light_switch;
JTextField t1,t2;
JLabel l0,l1,l2,l3,l4;
trafikIsigi1SWP ti1;
Container c;
public trafikIsigi1SWF()
{
c=getContentPane();
JPanel p1=new JPanel();
p1.setLayout(new GridLayout(2,4));
yik=new isikKontroluThread1(this);
yik.start();
ti1=new trafikIsigi1SWP(yik);
light_switch = new JButton("Işığı değiştir");
light_switch.setForeground(Color.black);
light_switch.setBackground(Color.lightGray);
t1=new JTextField(""+yik.getYesilZaman());
t2=new JTextField(""+yik.getKirmiziZaman());
l0=new JLabel(" ");
l1=new JLabel("yesil isik yanma zamani : ");
l2=new JLabel("saniye ");
l3=new JLabel("kirmizi isik yanma zamani : ");
l4=new JLabel("saniye ");
p1.add(light_switch);
p1.add(l1);
p1.add(t1);
p1.add(l2);
p1.add(l0);
p1.add(l3);
p1.add(t2);
p1.add(l4);
light_switch.addActionListener(this);
t1.addActionListener(this);
t2.addActionListener(this);
c.add(p1,BorderLayout.NORTH);
c.add(ti1,BorderLayout.CENTER);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==light_switch)
{
repaint();
}
else if(e.getSource()==t1)
{
Double i1=new Double(t1.getText());
yik.setYesilZaman(i1.doubleValue());
}
else if(e.getSource()==t2)
{
Double i1=new Double(t1.getText());
yik.setKirmiziZaman(i1.doubleValue());
}
}
public static void main(String[] args)
{
trafikIsigi1SWF pencere= new trafikIsigi1SWF();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(300,600);
pencere.setVisible(true);
}
}

09006.JPG

Şekil 9.6 trafikIsigi1.java trafik ışığı kontrol programı JFrame çıktısı

3. H8O2

Birbirinden bağımsız çalışan iki trafik ışığını iki ayrı ışık olarak simule edin. Bu ısıklardan birincisinde yesil veya sarı yanarken ikincisinde kırmızı yansın, ikincisinde yeşil veya sarı yanarken birincisinde kırmızı yansın. Kırmızı ve yeşil süreleri aynı olmayabilir, fakat birbirinin tersi olacaktır. Örneğin birinci ışıkta 6 saniye kırmızı, 10 saniye yeşil, 1 saniye sarı yanıyorsa, ikinci ışıkta 11 saniye kırmızı, 5 saniye yeşil, 1 saniye sarı yanacaktır. Birinci ışık sarıdan kırmızıya geçtiği anda ikinci ışık yeşil yanacaktır.

Program 9.18 : IkiTrafikIsigi.java programı

/Title: 8. Hafta Odevi
//Version: 1.1
//Copyright: Copyright (c) 1999
//Author: Hasan Er
//Company: Gebze Yuksek Teknoloji Enstitusu
//Description:
// version 1.1 Turhan Coban tarafından paint metotu
// degistirilmistir.

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.applet.*;

public class IkiTrafikIsigi extends Applet implements ActionListener

{
int bekleyen = 0;
boolean kontrolEdenVar = false;
IkiIsikKontroluThread yik[] = new IkiIsikKontroluThread[2];
char which_light[]= new char[] {'r', 'r'};
TextField t1, t2;
Label l1,l2,l3,l4;

public void init()
{
t1=new TextField("12");
t2=new TextField("12");
l1=new Label("kirmizi isik yanma zamani : ");
l2=new Label("saniye");
l3=new Label("yesil isik yanma zamani : ");
l4=new Label("saniye");
add(l1);
add(t1);
add(l2);
add(l3);
add(t2);
add(l4);
t1.addActionListener(this);
t2.addActionListener(this);
for(int i=0;i<2;i++)
{
yik[i]=new IkiIsikKontroluThread( this, i);
yik[i].start();
}
}

public synchronized void kontrolAl()
{
try
{
if ( kontrolEdenVar )
{
bekleyen++;
wait();
}
else
{
kontrolEdenVar = true;
}
}
catch ( InterruptedException interruptedEx)
{ interruptedEx.printStackTrace();}
}

public synchronized void kontrolBirak()
{
if ( bekleyen0 )
{
notify();
bekleyen--;
}
else
{
kontrolEdenVar = false;
}
}

public void paintIsik(Graphics g,int xi,int yi,int c)
{
int h1=360;
int w1=100;
int radius=40;
int hight_diff=30;
g.setColor(Color.black);
g.fillRect(xi,yi,w1,h1);
g.setColor(Color.white);
g.drawRect(xi-1,yi-1,w1+2,h1+2);
g.drawRect(xi-2,yi-2,w1+4,h1+4);
switch(which_light[c])
{
case 'g':
g.setColor(Color.lightGray);
g.fillOval(xi+10,yi+hight_diff,radius*2,radius*2);
g.fillOval(xi+10,yi+hight_diff*2+radius*2,radius*2,radius*2);
g.setColor(Color.green);
g.fillOval(xi+10,yi+hight_diff*3+radius*4,radius*2,radius*2);
break;
case 'r':
g.setColor(Color.lightGray);
g.fillOval(xi+10,yi+hight_diff*2+radius*2,radius*2,radius*2);
g.fillOval(xi+10,yi+hight_diff*3+radius*4,radius*2,radius*2);
g.setColor(Color.red);
g.fillOval(xi+10,yi+hight_diff,radius*2,radius*2);
break;
case 'y':
g.setColor(Color.lightGray);
g.fillOval(xi+10,yi+hight_diff,radius*2,radius*2);
g.fillOval(xi+10,yi+hight_diff*3+radius*4,radius*2,radius*2);
g.setColor(Color.yellow);
g.fillOval(xi+10,yi+hight_diff*2+radius*2,radius*2,radius*2);
break;
}
}

public void paint(Graphics g)
{
paintIsik(g,10,40,0);
paintIsik(g,210,40,1);
}

public void actionPerformed(ActionEvent e)
{
if(e.getSource()==t1)
{
Double i1=new Double(t1.getText());
for ( int i=0; i<yik.length; i++)
yik[i].setKirmiziZaman(i1.doubleValue());
}
else if(e.getSource()==t2)
{
Double i1=new Double(t2.getText());
for ( int i=0; i<yik.length; i++)
yik[i].setYesilZaman(i1.doubleValue());
}
}
}

Program 9.19 : IkiIsikThread.java programı

//Title: 8. Hafta Ödevi
//Version:
//Copyright: Copyright (c) 1999
//Author: Hasan Er
//Company: Gebze Yüksek Teknoloji Enstitüsü
//Description:

public class IkiIsikKontroluThread extends Thread {

double kirmiziZaman = 12.0;
double yesilZaman = 12.0;

IkiTrafikIsigi ti;
int isikNo;

public IkiIsikKontroluThread(IkiTrafikIsigi tiparam, int isikNo)
{
ti = tiparam;
this.isikNo = isikNo;
}

public void run()
{
char which = '\0';
try {
Thread.sleep( (int)( Math.random()*1000 ) );
}
catch( InterruptedException interruptedEx ) {
interruptedEx.printStackTrace();
}
while(true)
{
which = ti.which_light[ isikNo ];
//12 saniye bekle
try {
switch ( which ) {
case 'y' : ti.which_light[ isikNo ] = 'r';
ti.repaint();
break;
case 'g' : ti.which_light[ isikNo ] = 'y';
ti.repaint();
Thread.sleep( 1000 );
ti.kontrolBirak();
break;
case 'r' : ti.kontrolAl();
ti.which_light[ isikNo ] = 'g';
ti.repaint();
Thread.sleep((int)(yesilZaman*1000));
break;
}
}
catch(InterruptedException e)
{System.err.println(e.toString());}
}
}

public void setKirmiziZaman(double zi)
{
kirmiziZaman=zi;
}

public double getKirmiziZaman()
{
return kirmiziZaman;
}

public void setYesilZaman(double zi)
{
yesilZaman=zi;
}

public double getYesilZaman()
{
return yesilZaman;
}
}


09007.JP

ıkı trafık ısıgı


Şekil 9.7 sinkronize olarak çalışan iki trafik ışığı

4. H8OD2_2000

10 m3 boyutunda bir depomuz var. Bu depoya birinci pompa su doldurmakta, ikinci pompa is suyu boşaltmaktadır. Pompaların debileri değiştirilebilmektedir, ve kullanıcı tarafından gerektiğinde elle açılıp kapatılabilmektedir. Depo tamamen boşalırsa boşaltan pompa otomatik olarak durdurulacaktır. Depo tamamen dolarsa dolduran pompa otamatik olarak durdurulacaktır. Bu prosesi gerçek zamanda simule eden iki pompa ve bir depodan oluşan bir sistem oluşturunuz, sonuçları belli zaman aralıklarıyla ekrana yazdırınız (pompa1, pompa2 debileri ve depodaki su miktarı ve başlangıçtan itibaren geçen zaman) veya bir grafik çıktı üzerinden simulasyon çıktısını oluşturunuz. (aynı değerleri grafik çıktıda gösteriniz) Depodaki su miktarını bir ortak double değeri olarak düşünebiliriz.

Program 9.20 : H8OD2_2000.java programı

class H8OD2_2000

{

public static void main(String args[])

{

havuz h=new havuz();

Pompa1 p1 = new Pompa1(h);

Pompa2 p2 = new Pompa2(h);

p1.start();

p2.start();

}

}

class Pompa1 extends Thread

{

private havuz pTut;

private double debi;

public Pompa1(havuz h)

{

pTut=h;

}

public void run()

{

while(true)

{

while((debi = Math.abs((Math.random()*5))) == 0);

pTut.ekleSu(debi);

try{

sleep( (int) (Math.random()*3000 ) );

}

catch(InterruptedException e)

{

System.err.println("Exeption "+e.toString());

}

}

}

}

class Pompa2 extends Thread

{

private havuz cTut;

private double debi;

public Pompa2(havuz h)

{

cTut=h;

}

public void run()

{

while (true)

{

try{

sleep( (int) (Math.random()*3000));

}

catch(InterruptedException e)

{

System.err.println("Exeption "+e.toString());

}

while((debi = Math.abs((Math.random()*5))) == 0);

cTut.cikarSu(debi);

}

}

}

class havuz

{

private double OrtakSu = 0.0;

private boolean pompa1 = true;

private boolean pompa2 = false;

private final double kapasite = 10.0;

public synchronized void ekleSu(double suMiktari)

{

while (!pompa1)

{

try{

wait();

}

catch (InterruptedException e)

{

System.err.println("Exception:"+e.toString() );

}

}

OrtakSu += suMiktari;

if (OrtakSu >= kapasite){

pompa1 = false;

System.out.println("Pompa1'in debisi " + suMiktari + " dir. Depo Dolu!!! (10).");

OrtakSu = kapasite;

}

else

System.out.println("Pompa1'in debisi " + suMiktari + " dir. Depo daki su miktari :" + OrtakSu);

pompa2 = true;

notify();

}

public synchronized void cikarSu(double suMiktari)

{

while (!pompa2)

{

try{

wait();

}

catch (InterruptedException e)

{

System.err.println("Exception:"+e.toString() );

}

}

OrtakSu -= suMiktari;

if (OrtakSu <= 0)

{

pompa2=false;

System.out.println("Pompa2'in debisi " + suMiktari + " dir. Depo Bos!!! (0).");

OrtakSu = 0;

}

else

System.out.println("Pompa2'in debisi " + suMiktari + " dir. Depo daki su miktari :" + OrtakSu);

pompa1 = true;

notify();

}

}

1. AWT Animasyon örneği

Bu problemde animasyon’un thread kullanarak nasıl yapılacağını göreceğiz. Aslında kavram yeni değil aslında şu ana kadar bu bölümde yaptığımız tüm uygulamalar bir animasyon. Bu program java döküman kütüphanesinden alınmıştır.

Program 9.21 : AnimatorApplication.java programı

/*

* awt animasyon

*/

import java.awt.*;

import java.awt.event.*;

/*

* Arthur van Hoff'un animasyon örneği.

* Bu örnek tüm animasyonlar için örnek olarak kullanılabilir.

*/

public class AnimatorApplication extends Frame

implements Runnable {

int frameNumber = -1;

int delay;

Thread animatorThread;

boolean frozen = false;

AnimatorApplication(int fps, String windowTitle) {

super(windowTitle);

delay = (fps > 0) ? (1000 / fps) : 100;

addMouseListener(new MouseAdapter() {

public void mousePressed(MouseEvent e) {

if (frozen) {

frozen = false;

startAnimation();

} else {

frozen = true;

stopAnimation();

}

}

});

addWindowListener(new WindowAdapter() {

public void windowIconified(WindowEvent e) {

stopAnimation();

}

public void windowDeiconified(WindowEvent e) {

startAnimation();

}

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

}

public void startAnimation() {

if (frozen) {

//Hiç bir şey yapmanız gerekmez

//

} else {

//Animasyon başlıyor...

if (animatorThread == null) {

animatorThread = new Thread(this);

}

animatorThread.start();

}

}

public void stopAnimation() {

//Animasyon tread'ini durdur

animatorThread = null;

}

public void run() {

//Önce bu thread'in önceliğini düşürüyoruz,

// böylece öbür programlara engel olmaz

Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

//Başlama zamanını hatırla

long startTime = System.currentTimeMillis();

//hangi thread olduğumuzu hatırla

Thread currentThread = Thread.currentThread();

//gerçek zaman animasyon döngüsü

while (currentThread == animatorThread) {

//Animasyon ekranındaki rakamı artır

frameNumber++;

//rakamı göster

repaint();

//beklemeye al

try {

startTime += delay;

Thread.sleep(Math.max(0,

startTime-System.currentTimeMillis()));

} catch (InterruptedException e) {

break;

}

}

}

//animasyon ekranını çiz

public void paint(Graphics g) {

g.drawString("Frame " + frameNumber, 5, 50);

}

public static void main(String args[]) {

AnimatorApplication animator = null;

int fps = 10;

// saniyedeki çerçeve sayısını hesapla

if (args.length > 0) {

try {

fps = Integer.parseInt(args[0]);

} catch (Exception e) {}

}

animator = new AnimatorApplication(fps, "Animasyon awt");

animator.setSize(200, 60);

animator.setVisible(true);

animator.startAnimation();

}

}

09008.JPG

Şekil 9.8 awt animasyon örneği

2. swing Animasyon örneği

Bu örnek problemde bir öncekinin temel olarak aynısı, sadece swing kullanılmış hali

Program 9.22 : AnimatorApplicationSW.java programı

/*

* Swing versiyonu

*/

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

/*

* Arthur van Hoff'un animasyon örneği.

* Bu örnek tüm animasyonlar için örnek olarak kullanılabilir.

*/

public class AnimatorApplicationSW extends JFrame

implements Runnable {

AnimappPanel animappPanel;

int frameNumber = -1;

int delay;

Thread animatorThread;

boolean frozen = false;

AnimatorApplicationSW(int fps, String windowTitle) {

super(windowTitle);

delay = (fps > 0) ? (1000 / fps) : 100;

animappPanel = new AnimappPanel();

getContentPane().add(animappPanel);

addMouseListener(new MouseAdapter() {

public void mousePressed(MouseEvent e) {

if (frozen) {

frozen = false;

startAnimation();

} else {

frozen = true;

stopAnimation();

}

}

});

addWindowListener(new WindowAdapter() {

public void windowIconified(WindowEvent e) {

stopAnimation();

}

public void windowDeiconified(WindowEvent e) {

startAnimation();

}

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

}

public void startAnimation() {

if (frozen) { }

else {

//animasyonu başlat

if (animatorThread == null) {

animatorThread = new Thread(this);

}

animatorThread.start();

}

}

public void stopAnimation() {

//animasyon treadini durdur.

animatorThread = null;

}

public void run() {

//önceliği düşür.

Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

//başlama zamanı

long startTime = System.currentTimeMillis();

//thread tanımı

Thread currentThread = Thread.currentThread();

//animasyon döngüsü

while (currentThread == animatorThread) {

//animasyon çerçevesini bir artır

frameNumber++;

//göster

repaint();

//geciktir

try {

startTime += delay;

Thread.sleep(Math.max(0,

startTime-System.currentTimeMillis()));

} catch (InterruptedException e) {

break;

}

}

}

class AnimappPanel extends JPanel {

public AnimappPanel() {}

//animasyon çerçevesini çiz

public void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawString("Frame " + frameNumber, 5, 50);

}

}

public static void main(String args[]) {

AnimatorApplicationSW animator = null;

int fps = 10;

// Get frames per second from the command line argument

if (args.length > 0) {

try {

fps = Integer.parseInt(args[0]);

} catch (Exception e) {}

}

animator = new AnimatorApplicationSW(fps,"Animasyon swing versiyonu");

animator.setSize(200, 60);

animator.setVisible(true);

animator.startAnimation();

}

}

09009.JPG

Şekil 9.9 swing animasyon örneği

3. zaman ayarlı swing Animasyon örneği

Program 9.23 : AnimatorApplicationTimer.java programı

/*

* Tam anlamıyla swing'e dönüştürülmüş animasyon

*/

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

/*

* Arthur van Hoff'un animasyon örneğinden yazılmıştır.

*/

public class AnimatorApplicationTimer extends JFrame

implements ActionListener {

int frameNumber = -1;

int delay;

boolean frozen = false;

JLabel label;

Timer timer;

AnimatorApplicationTimer(int fps, String windowTitle) {

super(windowTitle);

delay = (fps > 0) ? (1000 / fps) : 100;

timer = new Timer(delay, this);

timer.setInitialDelay(0);

timer.setCoalesce(true);

addWindowListener(new WindowAdapter() {

public void windowIconified(WindowEvent e) {

stopAnimation();

}

public void windowDeiconified(WindowEvent e) {

startAnimation();

}

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

Container contentPane = getContentPane();

contentPane.addMouseListener(new MouseAdapter() {

public void mousePressed(MouseEvent e) {

if (frozen) {

frozen = false;

startAnimation();

} else {

frozen = true;

stopAnimation();

}

}

});

label = new JLabel("Frame ", JLabel.CENTER);

contentPane.add(label, BorderLayout.CENTER);

}

public void startAnimation() {

if (frozen) {

} else {

timer.start();

}

}

public void stopAnimation() {

timer.stop();

}

public void actionPerformed(ActionEvent e) {

frameNumber++;

label.setText("Frame " + frameNumber);

}

public static void main(String args[]) {

AnimatorApplicationTimer animator = null;

int fps = 10;

if (args.length > 0) {

try {

fps = Integer.parseInt(args[0]);

} catch (Exception e) {}

}

animator = new AnimatorApplicationTimer(fps, "zamanı ayarlanabilen swing animasyonu");

animator.pack();

animator.setVisible(true);

animator.startAnimation();

}

}

09010.JPG

Şekil 9.10 zaman ayarlı swing animasyon örneği


<< index    < bölüm 8           > bölüm 10                 bölüm başı