Trådprogrammering hvordan tilføjer jeg synkronisering til koden
Hej jeg er i gang med at lave projekt der giver to tråde mulighed for på skift at komme til. Den måde jeg har løst det på er ikke helt optimalt, da jeg bruger en wait som er sat til 1 millisekund. Herved kan mine to tråde skiftevis få adgang til min liste med objekter, hvis den ikke var der, ville den ene tråd køre hele tiden. Som sagt er dette ikke den mest optimale løsning, da den godt kan blive langsom, hvis det nu var 10.000 gange dette forløb skulle udføres. (1 millisekund x 10.000)Jeg har forsøgt mig lidt med synkronisering, men jeg kan ikke rigtigt få det til at virke. Mine 3 klasser er vist neden under, hvis i kan fortælle mig løsningen, ville det være fint.
/*
* Kø.java
*
* Created on 9. februar 2005, 07:50
*/
import java.util.LinkedList;
/**
*
* @author
*/
public class Kø
{
private LinkedList hægtetListe;
/** Creates a new instance of Kø */
public Kø()
{
hægtetListe = new LinkedList();
}
// Indsætter et element i køens hale
// Precondition: Der er mindre end 50 elementer i køen.
// Postcondition: antallet af elementer er forøget med en.
public synchronized void indsæt(Object element)
{
// hvis køen er fuld (har 50 elementer).
// så skal der ikke indsættes noget element
if(hægtetListe.size() >= 50)
{
System.out.println("Køen er fyldt op(" + hægtetListe.size() + "). der kan ikke indsættes flere elementer.");
}
else
{
hægtetListe.addLast(element);
System.out.println("Nyt element tilføjet. størrelse: " + hægtetListe.size());
}
}
// Udtager et element fra køens hoved og returnerer det.
// Precondition: Køen har mindst 1 element.
// Postcondition: Køen har 1 element mindre.
public synchronized Object udtag()
{
// hvis køen ikke er tom,
// så kan der tages et element ud.
if(hægtetListe.size() > 0)
{
Object element = hægtetListe.removeFirst();
System.out.println("Element fjernet. størrelse:" + hægtetListe.size());
return element;
}
else
{
System.out.println("Køen er tom(" + hægtetListe.size() + "). der kan ikke fjernes noget element.");
return null;
}
}
}
------Indsæt klasse --------
/*
* Indsætter.java
*
* Created on 9. februar 2005, 07:51
*/
/**
*
* @author
*/
public class Indsætter extends Thread
{
private Kø kø;
/** Creates a new instance of Indsætter */
public Indsætter(Kø kø)
{
this.kø = kø;
}
// Indsætter et element i det fælles køobjekt.
public void indsæt(Object element)
{
kø.indsæt(element);
// der ventes et kort øjeblik. Dette bevirker at andre tråde har
// mulighed for at tilgå det fælles objekt mens denne tråd sover.
vent(1);
}
// lader tråden sove et kort øjeblik
// ventetid = tid i millisekunder
private void vent(int ventetid)
{
try
{
Thread.currentThread().sleep(ventetid);
}
catch (Exception e)
{
System.out.println("Fejl i Indsætter, metode vent" + e);
}
}
public void run()
{
// Tester om der kan indsættes et givent antal elementer.
for (int i=0; i < 10;i++)
indsæt(new Object());
}
}
-------- Udtag klasse -------------
/*
* Udtager.java
*
* Created on 9. februar 2005, 07:51
*/
/**
*
* @author
*/
public class Udtager extends Thread
{
private Kø kø;
private Object sidstUdtagneElement;
/** Creates a new instance of Udtager */
public Udtager(Kø kø)
{
this.kø = kø;
}
// Udtager elementet i køens hoved.
public void udtag()
{
sidstUdtagneElement = kø.udtag();
// der ventes et kort øjeblik. Dette bevirker at andre tråde har
// mulighed for at tilgå det fælles objekt mens denne tråd sover.
vent(1);
// her kunne kode der tager elementet i brug implementeres.
// Dette er dog ikke ønsket i dette projekt.
}
// lader tråden sove et kort øjeblik
// ventetid = tid i millisekunder
private void vent(int ventetid)
{
try
{
Thread.currentThread().sleep(ventetid);
}
catch (Exception e)
{
System.out.println("Fejl i Indsætter, metode vent" + e);
}
}
public void run()
{
// Tester om der kan udtages et givent antal elementer.
for (int i=0; i < 20;i++)
{
udtag();
}
}
}
