Java opgaver - Deadlock

Tags:    java

Hej.
Jeg er ved at uddanne mig til datamatiker, mega spændende og udfordrende.
Derfor er jeg rendt ind i et problem der omhandler deadlock af 2 tråde.
Opgaven går ud på at jeg lavet 2 tråde der hver iser har låst en fil, hvorefter den ene prøver at låse den anden og visa versa, og derfor opstår der en deadlock.
Vi skal nu rette opgaven så deadlock ikke opstår og der gives en advarsel istedet.
Jeg har 3 klasser, hvoraf 2 af dem er interessante, den sidste er bare en main der laver og startere trådene.

Klassen MyThread:
public class MyThread extends Thread{
private String fil1, fil2;

public MyThread(String fil1, String fil2, String navn){
super(navn);
this.fil1 = fil1;
this.fil2 = fil2;
}
public void run(){
//Lås fil 1
Metoder.getFileChannelWithLock(this.fil1);

//Vent 2 sec
try {
this.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

//Lås fil 2
Metoder.getFileChannelWithLock(this.fil2);

}

}

Klassen Metoder :

import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class Metoder {
public static FileChannel getFileChannelWithLock(String fileName)
{
// Get a file channel for the file
File tempFile = new File(fileName);
FileChannel tempChannel = null;
try
{
tempChannel = new RandomAccessFile(tempFile, "rw").getChannel();
} catch (FileNotFoundException e)
{
e.printStackTrace();
return tempChannel;
}

FileLock lock = null;

while (lock == null)
{
try
{
lock = tempChannel.tryLock();
}
catch (Exception e)
{
// ignore
}
if (lock == null) {
System.out.println(fileName + " lock kan ikke skaffes, venter");
try {
Thread.sleep(2000);
}
catch (InterruptedException e) {
// ignore
}
}
}

System.out.println("Forsøg på lås af " + fileName + ", IsValid: " + lock.isValid());
return tempChannel;
}
}

Nogen der har nogle hints eller forslag til hvad der skal gøres?
Mvh




2 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Hej,

Det er et utroligt spændende område - det er også utrolig vigtigt.

Prøv at kigge på Mutual Exclusion : http://en.wikipedia.org/wiki/Mutual_exclusion - det skal nok give nogle hints :)



Brug javas Monitor.



t