Avatar billede brianb Nybegynder
09. august 2008 - 02:41 Der er 10 kommentarer

Tråde

Hejsa eksperter,

Jeg har lige lavet denne random klasse, som jeg gerne vil have til at køre med en tråd, jeg vil gøre sådan, at når denne kode ikke er "50" så kører en tråd i en ny seperat klasse hvor den udskriver "Tallet ikke fundet..", og når den så ER "50" så skal en anden klasse udskrive "fundet", det er simpelthen fordi jeg ikke kan finde ud af at få 2 tråde til at køre på samme tid, jeg har problemer med at forstå det med notificering

public class ran {

    public int random(){
       
        int random = 0;
       
        random += Math.random()*100+1;
   
   
        return random;
    }
   
    public int udskriv(){
        int i = 0;
        while(random()!=50){
            i++;
            System.out.println("Ikke 50, antal forsøg "+i);
                try{
                    notify();
                    wait();
                }
                catch( InterruptedException e ) {
                    //ignore
                }
               
        }
        return 0;
       
    }
    public static void main(String[] args){
        ran r = new ran();
        r.udskriv();
    }
   
}
Avatar billede brianb Nybegynder
09. august 2008 - 03:01 #1
De to andre klasser

public class koer implements Runnable{

public void run(){

System.out.println("Tallet ikke fundet")

try{}
catch{}
}

public class fundet implements Runnable{

public void run(){

System.out.println("Fundet!")

try{}
catch{}
}
Avatar billede arne_v Ekspert
09. august 2008 - 04:23 #2
Du starter en tråd med:

Thread t = new Thread(nogetrunnable);
t.start();

men det er ikke lige umiddelbart indlysende for mig, hvordan du vil bruge
det i ovenstående program.
Avatar billede brianb Nybegynder
09. august 2008 - 13:55 #3
Altså det som er hensigten er at når den prøver at gætte tallet 50 og kører så skal klasse koer notificeres og komme med en system.out, og når tallet er gætte skal koer så blive til wait og klasse "fundet" starter med at køre og så gå på sleep
Avatar billede arne_v Ekspert
09. august 2008 - 21:24 #4
Og hvorfor vil du bruge tråde til det ?
Avatar billede brianb Nybegynder
09. august 2008 - 21:43 #5
Sådan set bare for at forstå det med notificering hvordan du med en klasse starter to tråde, hvor den ene notificerer den anden og så to seperate klasser med hver sin tråd starter, der er ikke noget hokus pokus i det andet end forståelse :)
Avatar billede arne_v Ekspert
09. august 2008 - 23:09 #6
Det er en opgave som er ret svær at løse fordi tråde ikke er beregnet til at blive brugt på
den måde.

Mit bedste bud er:

package august;

import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.SynchronousQueue;

public class ThreadFun {
    private static Random rng = new Random();
    public static void main(String[] args) throws Exception {
        SynchronousQueue<String> sq1 = new SynchronousQueue<String>();
        SynchronousQueue<String> sq2 = new SynchronousQueue<String>();
        NotFound t1 = new NotFound(sq1, sq2);
        t1.start();
        Semaphore fnd = new Semaphore(1);
        fnd.acquire();
        Found t2 = new Found(fnd);
        t2.start();
        while(rng.nextInt(100) != 50){
            System.out.println("In loop");
            sq1.put("go");
            sq2.take();
        }
        t1.setDone();
        fnd.release();
        t1.interrupt();
        t1.join();
        t2.join();
    }
}

class NotFound extends Thread {
    private SynchronousQueue<String> sq1;
    private SynchronousQueue<String> sq2;
    private volatile boolean done;
    public NotFound(SynchronousQueue<String> sq1, SynchronousQueue<String> sq2) {
        this.sq1 = sq1;
        this.sq2 = sq2;
        this.done = false;
    }
    public void run() {
            try {
                while(!done) {
                    sq1.take();
                    System.out.println("Ikke fundet!");
                    sq2.put("go");
                }
            } catch (InterruptedException e) {
            }
    }
    public void setDone() {
        done = true;
    }
}

class Found extends Thread {
    private Semaphore fnd;
    public Found(Semaphore fnd) {
        this.fnd = fnd;
    }
    public void run() {
            try {
                fnd.acquire();
                System.out.println("Fundet!");
            } catch (InterruptedException e) {
            }
    }
}
Avatar billede arne_v Ekspert
29. august 2008 - 02:33 #7
kommet videre ?
Avatar billede brianb Nybegynder
29. august 2008 - 07:24 #8
Jep helt fint, smid endelig et svar ;)
Avatar billede arne_v Ekspert
29. august 2008 - 15:18 #9
ok
Avatar billede arne_v Ekspert
28. oktober 2008 - 23:42 #10
så mangler du bare at acceptere svaret
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester