Avatar billede brianb Nybegynder
04. juli 2008 - 20:06 Der er 23 kommentarer og
1 løsning

Oprette en tråd som notificerer en anden klasse

Hejsa,

Jeg fatter ikke det med at få en tråd til at notificere en anden tråd, jeg har fået en tråd til at køre via en string, så den kører med et random output, nu vil jeg så have at når den rammer en af de random output, skal den samtidig notificere en anden klasse, som så skriver et eller andet ud med en system.out.


public class Tr extends Thread
{

    String c;
    static int count = 0;
   
    public Tr(String c)
    {
        this.c = c;
    }
   
    public void run(){

        try {
           
            while(count < 99){
                count++;
           
               
                if(c == "a")
                {
                    Thread.sleep((int)Math.random()*10000000+1000);

                }
                if(c == "b")
                {
                    Thread.sleep((int)Math.random()*10000000+1000);

                }
                if(c == "c")
                {
                    Thread.sleep((int)Math.random()*10000000+1000);

                   
                }

                System.out.print(c);
            }
        }
       
        catch (InterruptedException e) {
            System.out.println("Interrupted exception caught");
            e.printStackTrace();
        }
    }
   
    public static void main(String[] args)
        {
            new Tr("a").start();
            new Tr("b").start();
            new Tr("c").start();
        }
   
}
Avatar billede arne_v Ekspert
04. juli 2008 - 20:17 #1
Hvad er det helt præcist du vil ?

Du kører 3 tråde som hver udskriver den samme streng 99 gange med et tilfældigt interval
imellem.

Jeg synes ikke at programmet matcher teksten.

Vil du bare gerne have nogle eksempler på hvordan en tråd når den har noget information
færdig kan sende den over til tråd B som så kører videre med den ?

Eller er det noget mere specifikt du søger ?
Avatar billede brianb Nybegynder
04. juli 2008 - 20:47 #2
Den kører 100 gange, nul er med ikke sandt?

Jeg vil have at når den fx == "C" skal en tråd fra en anden klasse start med

tråd.notify() og så skriver den fx. "HEJ HEJ, Så kører jeg!"
Avatar billede arne_v Ekspert
04. juli 2008 - 21:08 #3
0..98 er 99 tal

du mener iøvrigt nok c.equals("c") og ikke c == "c"

men jeg kan prøve at bixe et eksempel
Avatar billede brianb Nybegynder
04. juli 2008 - 21:28 #4
Det virker begge dele :)
Avatar billede arne_v Ekspert
04. juli 2008 - 21:38 #5
package june;

import java.util.concurrent.Semaphore;

public class SemTest {
    public static void main(String[] args) {
        (new ST1()).start();
    }
}

class ST1 extends Thread {
    private Semaphore sem;
    public ST1() {
        this.sem = new Semaphore(1);
    }
    public void run() {
        try {
            sem.acquire();
            (new ST2(sem)).start();
            System.out.println(System.currentTimeMillis());
            Thread.sleep(2000);
            sem.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class ST2 extends Thread {
    private Semaphore sem;
    public ST2(Semaphore sem) {
        this.sem = sem;
    }
    public void run() {
        try {
            sem.acquire();
            System.out.println(System.currentTimeMillis());
            sem.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
04. juli 2008 - 21:38 #6
package june;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class QueueTest {
    public static void main(String[] args) {
        (new QT1()).start();
    }
}

class QT1 extends Thread {
    private BlockingQueue<String> que;
    public QT1() {
        this.que = new LinkedBlockingQueue<String>();
    }
    public void run() {
        try {
            (new QT2(que)).start();
            System.out.println(System.currentTimeMillis());
            Thread.sleep(2000);
            que.add("ABC");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class QT2 extends Thread {
    private BlockingQueue<String> que;
    public QT2(BlockingQueue<String> que) {
        this.que = que;
    }
    public void run() {
        try {
            String s = que.take();
            System.out.println(s);
            System.out.println(System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
04. juli 2008 - 21:43 #7
Med hensyn til == versus equals så prøv lige følgende lille program:

package june;

public class Eq {
    public static void test(String s1, String s2) {
        System.out.println(s1 + " == " + s2 + " : " + (s1 == s2));
        System.out.println(s1 + " equals " + s2 + " : " + (s1.equals(s2)));
    }
    public static void main(String[] args) {
        test("ab", "ab");
        test("ab", "a" + "b");
        test(new String("ab"), new String("ab"));
        test("ab", "ab".substring(0, 1) + "ab".substring(1, 2));
    }
}
Avatar billede brianb Nybegynder
04. juli 2008 - 22:07 #8
Hmm.. apropos denne problemstilling så bøvler jeg med en validering, for lige at lave et sidespring, hvor den skal gå ind og tjekke op på en String ud fra et chararray, jeg kan bare ikke lige gennemskue hvad jeg gør galt?

public boolean erValidHurtig(String regNr)
    {
        regNr = "AB12345";
       
        char[] et = {'A','B'};
        char[] to = {'D','E','F'};
       
        for (int i=0; i<et.length; i++){
           
            if(regNr.charAt(0) == to.length){
                return true;
            }
        }       
   
        return false;
    }
Avatar billede arne_v Ekspert
04. juli 2008 - 23:49 #9
Jeg kan ikke gennemskue hvad koden skal gøre. Kan du beskrive sammenhængen
mellem input og output ?
Avatar billede brianb Nybegynder
05. juli 2008 - 00:31 #10
Koden skal retunere true hvis det første bogstav i strengen er i chararray "et", jeg laver så en for-løkke der render det igennem hvis charAt(0) er i regNr på plads 1
Avatar billede arne_v Ekspert
05. juli 2008 - 02:13 #11
public boolean erValidHurtig(String regNr) {
    return "AB".indexOf(regNr.charAt(0));
}

bar ihvertfald en måde at lave det på.
Avatar billede arne_v Ekspert
05. juli 2008 - 02:14 #12
ups

public boolean erValidHurtig(String regNr) {
    return "AB".indexOf(regNr.charAt(0)) >= 0;
}
Avatar billede brianb Nybegynder
05. juli 2008 - 04:03 #13
Jeg er ikke helt sikker på, at du forstår hvad jeg mener, jeg vil gerne gøre sådan, at jeg med hver char[] kan tjekke henholdsvis det første tegn i stringen på plads 0 og med det andet char[] plads 1, og hvis der er et af bogstaverne så skal den retunere true, eller også skal den til sidste retunere false, hvis ingen af kravene er opfyldt

Den her linje er jeg usikker på, for den retunerer ikke true

if(regNr.charAt(0) == to.length){
                return true;

Den skal gå ind på charArray to og tjekke om bogstavet er der og ligemeget hvad jeg skriver i Stringen retunerer den ikke det den skal.
Avatar billede lborupj Nybegynder
05. juli 2008 - 13:42 #14
Hej - Jeg kan ikke få det logisk til at give mening, men nu ved jeg heller ikke hvad det er du er ved at skrive.. Som jeg læser det:

public boolean erValidHurtig(String regNr) {
        String regNr = "AB12345";
        char[][] arrays = { {'A','B'}, {'C','D','E'} };
        for (int i=0;i<arrays.length;i++) {
            for (int j=0;j<arrays[i].length;j++) {
              if (regNr.charAt(i)).equals(arrays[i][j])
                return true;
            }
        }
        return false;
}

Bemærk jeg ikke har compilet det og jeg er lidt i tvivl om 2d array'et kan defineres således i java. Den kan også vendes om, således at i følger regNr length istedet, men et tjek af om du out-of-bounds..
Avatar billede brianb Nybegynder
05. juli 2008 - 15:45 #15
Der er en fejl i sætningen

if (regNr.charAt(i)).equals(arrays[i][j]){ med at gå fra char til int, jeg skal kun tjekke på plads 0 i strengen. Og det skal kun være med det ene array
Avatar billede brianb Nybegynder
05. juli 2008 - 16:57 #16
Jeg har lige lavet en ny version, men den virker af uforklarlige grunde heller ikke.. suk

public boolean erValidHurtig(String regNr)
    {
   
        regNr = "AE12345";
       
        char[] et = {'A','B'};
        char[] to = {'D','E','F'};
       
        if (regNr.length() != 7){
            return false;
        }
       
        int firstBogstav = 0;
        int secondBogstav = 0;
       
        for (int i=0; i<et.length; i++){
           
            if (regNr.charAt(0) == et[i]){
                firstBogstav++;
            }
        }
       
        for (int j=0; j<to.length; j++){
           
            if (regNr.charAt(1) == to[j]){
                secondBogstav++;
            }   
        }
       
        if (firstBogstav == 1 || secondBogstav == 1){
            return true;
        }
       
        return false;
    }
Avatar billede brianb Nybegynder
05. juli 2008 - 16:59 #17
Hvis jeg så bare tænkte mig om og lavede en && så virker det faktisk :D
Avatar billede arne_v Ekspert
05. juli 2008 - 18:13 #18
Et par alternative implementationer:

    public boolean erValidHurtig1(String regNr) {
        return "AB".indexOf(regNr.charAt(0)) >= 0
              && "CDE".indexOf(regNr.charAt(1)) >= 0;
    }
    private Pattern re = Pattern.compile("^[AB][CDE]");
    public boolean erValidHurtig2(String regNr) {
        return re.matcher(regNr).matches();
    }
Avatar billede brianb Nybegynder
05. juli 2008 - 23:12 #19
Arne du er så ond til regular expression, smid et svar og få dine velfortjente point :)
Avatar billede brianb Nybegynder
05. juli 2008 - 23:13 #20
Gælder også dig borup :)
Avatar billede arne_v Ekspert
05. juli 2008 - 23:15 #21
svar
Avatar billede arne_v Ekspert
06. juli 2008 - 03:17 #22
skulle borup ikke have haft ?
Avatar billede flar74 Nybegynder
06. juli 2008 - 12:00 #23
En anden gang du har Java Concurrency problemer, så er der her en længere tutorial, m. ca. 20 tekster ialt:

http://tutorials.jenkov.com/java-concurrency/index.html

Thread signaling (wait() / notify() ) er også forklaret her, samt mange andre issues.
Avatar billede arne_v Ekspert
06. juli 2008 - 15:27 #24
Med java.util.concurrent er brug af wait() og notify() sjaeldent noedvendigt.
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
Kategori
Kurser inden for grundlæggende programmering

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