9.1 PARALEL KULLANIM(MULTITHREADING) VE GERÇEK ZAMAN PROGRAMLANMASI
9.2 PARALEL PROGRAM KULLANIMIDA HAFIZA SİNKRONİZASYONU
İş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.
İ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.
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
Ş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şı