Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Aethelstone
    addikt

    Üdv. HTTP szervert próbálok írni gyakorlásként. Chrome-nak van egy preload funkciója ami nyit egy plusz socketet amit gyakorlatilag csak parkoltat esetleges későbbi tartalmak párhuzamos letöltésére.
    A socket stream-jéből nem lehet olvasni így csak feleslegesen foglal egy szálat timeout-ig.
    Van valami jó módszer arra hogy ezeket meg tudjam különböztetni egy valós http kéréstől ami valamilyen hiba miatt nem tudott írni a streamre?

    Ne foglalkozz vele. Az úgy sem fog beesni a http szerverbe. Böngészőspecifikus dolog.

  • E.Kaufmann
    veterán

    Üdv. HTTP szervert próbálok írni gyakorlásként. Chrome-nak van egy preload funkciója ami nyit egy plusz socketet amit gyakorlatilag csak parkoltat esetleges későbbi tartalmak párhuzamos letöltésére.
    A socket stream-jéből nem lehet olvasni így csak feleslegesen foglal egy szálat timeout-ig.
    Van valami jó módszer arra hogy ezeket meg tudjam különböztetni egy valós http kéréstől ami valamilyen hiba miatt nem tudott írni a streamre?

    annyira gond az a plusz szál technikai okokból? Nem lehet simán nem foglalkozni vele?

  • Karma
    félisten

    AES128 bit kulcsot szeretnék generálni String input alapján. A String hossza bármi lehet. A függvény a következőt csinálná:
    -Ha a String 16 karakter akkor nincs teendő
    -Ha több mint 16 karakter akkor ArrayUtils.subArray(key.toCharArray(), 0, 16) majd ezt a végén vissza String-gé
    -Ha kevesebb mint 16 karakter (N hosszú), akkor key.toCharArray(), egy új CharArray-be N-ig a key értékei, azon felül pedig egy karakter. A példában "c".

    Így minden esetben 16 karakter hosszú kulcsot kapok. Ez működik is (String.valueOf-fal). Viszont nem 128 bit lesz a végeredmény.

    16 vagy több karakterrel működik hibátlanul. A probléma akkor keletkezik ha ki kell egészíteni plusz karakterekkel: Invalid AES key length: 28 bytes
    Jelenleg sysout esetén nem is a key-t kapom meg, hanem a referenciáját.

    String pin = "1234";
    ...
    ...
    // így fut le ha 16-nál rövidebb a pin
    String[] keyArr = new String[16];
    pinArr = pin.toCharArray();
    for(int i=0;i<pin.length();i++) {
    keyArr[i] = String.valueOf(pinArr[i]);
    }
    for(int i = pin.length();i<16;i++) {
    keyArr[i] = "c";
    }
    key = String.valueOf(keyArr);
    System.out.println(key); // String helyett reference

    Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, aesKey); // java.security.InvalidKeyException: Invalid AES key length: 28 bytes
    byte[] encrypted = cipher.doFinal(password.getBytes());

    Vannak bejáratott algoritmusok kulcsgenerálásra, például a PBKDF2. Szerintem alapvetően fatális ötlet bármilyen kriptográfiával kapcsolatos implementációnak nekiállni, mert ebben a témakörben túl könnyű hibázni - lásd axioma megjegyzését a kulcsok értékkészletéről.

    (Kivéve, ha házi feladatról van szó és konkrétan ez a feladat.)

    RexpecT: Nem ártana egy kis kód, hogy hogyan próbálod meghívni az URL-t.

  • axioma
    veterán

    AES128 bit kulcsot szeretnék generálni String input alapján. A String hossza bármi lehet. A függvény a következőt csinálná:
    -Ha a String 16 karakter akkor nincs teendő
    -Ha több mint 16 karakter akkor ArrayUtils.subArray(key.toCharArray(), 0, 16) majd ezt a végén vissza String-gé
    -Ha kevesebb mint 16 karakter (N hosszú), akkor key.toCharArray(), egy új CharArray-be N-ig a key értékei, azon felül pedig egy karakter. A példában "c".

    Így minden esetben 16 karakter hosszú kulcsot kapok. Ez működik is (String.valueOf-fal). Viszont nem 128 bit lesz a végeredmény.

    16 vagy több karakterrel működik hibátlanul. A probléma akkor keletkezik ha ki kell egészíteni plusz karakterekkel: Invalid AES key length: 28 bytes
    Jelenleg sysout esetén nem is a key-t kapom meg, hanem a referenciáját.

    String pin = "1234";
    ...
    ...
    // így fut le ha 16-nál rövidebb a pin
    String[] keyArr = new String[16];
    pinArr = pin.toCharArray();
    for(int i=0;i<pin.length();i++) {
    keyArr[i] = String.valueOf(pinArr[i]);
    }
    for(int i = pin.length();i<16;i++) {
    keyArr[i] = "c";
    }
    key = String.valueOf(keyArr);
    System.out.println(key); // String helyett reference

    Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, aesKey); // java.security.InvalidKeyException: Invalid AES key length: 28 bytes
    byte[] encrypted = cipher.doFinal(password.getBytes());

    1. Elvi szinten nagyon nem ertek egyet az ilyen modon torteno AES kulcs megadassal (gyakorlatilag 256^16 helyett kb. 80^16 kulcsot "engedsz meg" - klavirol elerheto kis/nagy betuk, szmaok, gyakoribb jelek), ezzel kapasbol mar matematikailag is tobb mint 8 nagysagrenddel csokkented a lehetosegeket... de ha az emberek jelszoadasi szokasait nezzuk, kb. beepited a rendszerbe a betoresi pontot a human tenyezovel).
    2. Mi az oka annak, hogy a char array-t string tombbe masolva akarod kiegesziteni? Nem latom a koncepciot.
    Sot azt sem igazan, hogy minek jon be a char array... te egy 16 hosszu stringet akarsz, akkor ha nagyobb, akkor subString, ha kisebb, akkor meg mondjuk (ha nagyon egyszeru/fapados kodot szeretnel) ciklusban hozzaadsz amig nem jo a hossz egy "c"-t.
    Vagy me'g egyszerubb ha mindkettot egy lepesben intezed el... azaz a bejovo stringhez alapbol hozzaadod azt a fix stringet, amiben 16 db 'c' van, es veszed a subString-gel az elso 16 karaktert. Ez mindharom esetre egyetlen utasitassal visszaadja az altalad va'gyott tipusu kiegeszitest.

    szerk. kellett nekem ennyit gepelni :)

  • tick
    aktív tag

    AES128 bit kulcsot szeretnék generálni String input alapján. A String hossza bármi lehet. A függvény a következőt csinálná:
    -Ha a String 16 karakter akkor nincs teendő
    -Ha több mint 16 karakter akkor ArrayUtils.subArray(key.toCharArray(), 0, 16) majd ezt a végén vissza String-gé
    -Ha kevesebb mint 16 karakter (N hosszú), akkor key.toCharArray(), egy új CharArray-be N-ig a key értékei, azon felül pedig egy karakter. A példában "c".

    Így minden esetben 16 karakter hosszú kulcsot kapok. Ez működik is (String.valueOf-fal). Viszont nem 128 bit lesz a végeredmény.

    16 vagy több karakterrel működik hibátlanul. A probléma akkor keletkezik ha ki kell egészíteni plusz karakterekkel: Invalid AES key length: 28 bytes
    Jelenleg sysout esetén nem is a key-t kapom meg, hanem a referenciáját.

    String pin = "1234";
    ...
    ...
    // így fut le ha 16-nál rövidebb a pin
    String[] keyArr = new String[16];
    pinArr = pin.toCharArray();
    for(int i=0;i<pin.length();i++) {
    keyArr[i] = String.valueOf(pinArr[i]);
    }
    for(int i = pin.length();i<16;i++) {
    keyArr[i] = "c";
    }
    key = String.valueOf(keyArr);
    System.out.println(key); // String helyett reference

    Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, aesKey); // java.security.InvalidKeyException: Invalid AES key length: 28 bytes
    byte[] encrypted = cipher.doFinal(password.getBytes());

    Lejárt a szerkesztési idő:
    UPDATE, találtam egy egyszerűbb megoldást ami működik is :)
    for(int i = 0;i<16-pin.length();i++)
    addition+="c";
    key=pin+addition;

  • axioma
    veterán

    Sziasztok,

    Arrays.toString(charArr) után Eclipse konzol tömbként írja ki a stringem. (getClass String-nek ismeri fel) Ennek mi lehet az oka?
    Konkrétan így:
    [1, 2, 3, 4, 5, c, c, c, c, c, c, c, c, c, c, c]

    A másik nagy gondom hogy a felső 16 karakter így 48 bájtot foglal. Míg ha simán Stringként megadom csak 16-ot. Hogyan lehetne ezt orvosolni?

    AES kulcs ellenőrzésről lenne szó. Ha nem éri el a 16 karaktert/bájtot akkor hozzádobál c betűket.

    Ezt keresed? new String(charArray)

    Vagy String.valueOf(charArray)

    Masik kerdes: ez most 16 felbyte (hexa karakter), vagy 16 teljes byte? AES128? Fura, hogy chartomb lett belole... honnan jon az input?

  • Karma
    félisten

    Sziasztok,

    Arrays.toString(charArr) után Eclipse konzol tömbként írja ki a stringem. (getClass String-nek ismeri fel) Ennek mi lehet az oka?
    Konkrétan így:
    [1, 2, 3, 4, 5, c, c, c, c, c, c, c, c, c, c, c]

    A másik nagy gondom hogy a felső 16 karakter így 48 bájtot foglal. Míg ha simán Stringként megadom csak 16-ot. Hogyan lehetne ezt orvosolni?

    AES kulcs ellenőrzésről lenne szó. Ha nem éri el a 16 karaktert/bájtot akkor hozzádobál c betűket.

    Az Arrays.toString helyesen működik, épp csak nem azt csinálja, amit szeretnél. Ami egyébként nem is teljesen világos, micsoda.

  • WonderCSabo
    félisten

    Azt használom most, viszont macerás. Néha egyszerűen minden ok nélkül megáll vagy elhagyja a cookie-kat és emiat logoutol a webappból. Sőt 3-ből ~1-szer az első get nem is kap választ és timeout-ol. 3-ból 2-szer pedig egy másodpercen belül megvan. Nincs network probléma, a forrás konstans elérhető.
    Windows esetén még könnyen mellékelem a jar-ba és kimásolom az azonos mappába futáskor, még a bináris beállítása előtt.
    Linux esetén viszont ha nincs telepítve, akkor nem hajlandó futni. (Fedora alapú linuxnál pedig működésre sem tudtam bírni, de ez nem jelent problémát, mivel az egyetlen redhat-es emberke átmigrál)

    @WonderCSabo: Selenium átalakította, itt látszik is a rengeteg selenium import.

    Én nem látok itt semmi átalakítást. Működik is nekem:

    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>seleniumtest</groupId>
    <artifactId>seleniumtest</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
    <dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>2.45.0</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <version>2.16</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
    </dependency>
    </dependencies>
    </project>

    Teszt osztály:

    public class HtmlUnitTest {

    @Test
    public void testHtmlUnit() {
    WebDriver driver = new HtmlUnitDriver();

    driver.get("http://www.google.com");

    WebElement element = driver.findElement(By.name("q"));

    element.sendKeys("htmlunit");

    element.submit();

    System.out.println("Page title is: " + driver.getTitle());

    driver.quit();
    }
    }

    Mondjuk alapból 2.15-ös htmlunit-ot használ a legújabb Selenium, szóval nagy változásokra nem kell számítani a 2.16-s verziótól...

  • moriak
    tag

    Próbáltam cserélni, de utána class not found errorokat kaptam sajnos
    (a file nevet is cseréltem, és próbáltam újra importálni is)

    Ajánlom a PhantomJS-t. Kicsivel összeszedettebb mint a HtmlUnitDriver.

  • WonderCSabo
    félisten

    Próbáltam cserélni, de utána class not found errorokat kaptam sajnos
    (a file nevet is cseréltem, és próbáltam újra importálni is)

    Milyen class-okat hiányolt? Benne vannak azok az új jarban?

  • WonderCSabo
    félisten

    Selenium jar-ban vajon lehetne manuálisan frissíteni htmlunit-ot? Google nem siet a poodle reakcióval :/

    Ha rendes függőségkezelést használt (pl. Maven vagy Gradle), akkor egyszerűen csak deklarálni kell az újabb verziót és azt fogja használni. Ha az egybecsomagolt zipet használod, akkor ki kell dobni onnan kézzel a libs mappából a htmlunit jart, és berakni az újabbat.

  • floatr
    veterán

    akkor is ha nem buffered?

    Igaza van a többieknek a Writer osztályokkal kapcsolatban a doksi alapján, de:

    public abstract class Writer implements Appendable, Closeable, Flushable {
    ...
    abstract public void close() throws IOException;
    ...
    }

    garancia nincsen rá h az implementációk meg is fogják csinálni.

    public class FileWriter extends OutputStreamWriter {
    ...
    }

    a FileWriter egy OutputStreamWriter "wrapper"

    public class OutputStreamWriter extends Writer {

    private final StreamEncoder se;
    ...
    public void close() throws IOException {
    se.close();
    }
    ...
    }

    namost a StreamEncoder nálam egy sun csomagos implementáció, a bytekód szerint úgy látom h meghív két flush jellegű metódust

    void implClose() throws java.io.IOException;
    0 aload_0 [this]
    1 aconst_null
    2 iconst_1
    3 invokespecial sun.nio.cs.StreamEncoder.flushLeftoverChar(java.nio.CharBuffer, boolean) : void [64]
    6 aload_0 [this]
    7 getfield sun.nio.cs.StreamEncoder.encoder : java.nio.charset.CharsetEncoder [39]
    10 aload_0 [this]
    11 getfield sun.nio.cs.StreamEncoder.bb : java.nio.ByteBuffer [41]
    14 invokevirtual java.nio.charset.CharsetEncoder.flush(java.nio.ByteBuffer) : java.nio.charset.CoderResult [71]

    tehát elvileg jó a cucc, ha a sort lezárod. Ennek ellenére én továbbra is aszondom, hogy ártani nem árt, ha használod a flush-t, ráadásul ha netán Writer helyett OutputStream-et használsz valahol, akkor megkíméled magad egy sunyi problémától.

  • floatr
    veterán

    Nincs exception ez a bajom, már kigugliztam volna a megoldást :)
    Megpróbáltam több féle módszert is amit google elém tárt, de egyszerűen egyik sem működik. És nem értem miért.

    Így működik!! :) Köszi!

    if(!logFile.exists()){
    logFile.createNewFile();
    }
    FileWriter fw = new FileWriter(logFile, true);
    fw.write(s.toString() + System.getProperty("line.separator"));
    fw.close();

    A flush hiányzik a close előtt. Ezt egy életre jegyezd meg, hogy ha file-ba írsz, hogy zárás előtt flush.

  • WonderCSabo
    félisten

    Üdv!

    Egy saját "loggert" használok és console mellett fájlba is szeretném kiírni. A fájlt létrehozza sikeresen, de egyszerűen nem ír bele semmit. Mi lehet a gond?

    public class Logger {
    private static File logFile = new File(ClassLoader.getSystemClassLoader().getResource(".").getPath()+"log.txt");

    public static void log(Object s) {
    if(!Settings.logging) return;
    //console
    System.out.println("L: "+s);

    //file
    try {
    if(!logFile.exists()){
    logFile.createNewFile();
    }
    FileWriter fw = new FileWriter(logFile.getName(),true);
    BufferedWriter bw = new BufferedWriter(fw);
    bw.newLine();
    bw.write(s.toString());
    bw.close();
    fw.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    Számomra jónak tűnik a cucc, le is futtattam, létrehozza a fájlt és logol is bele. Két gondolatom van csak:

    Settings.logging esetleg nem false?

    FileWriter fw = new FileWriter(logFile.getName(),true);

    Ezzel vigyázz, mert ez csak a current directoryban fogja létrehozni a fájlt a névvel, szóval nem ott lesz, ahol sejted. Pl. ha IDE-ből futtatod:

    logFile útvonala a build mappában belül log.txt

    new FileWriter(logFile.getName(),true) viszont az aktuális mappában, tehát a projekt mappában hozza létre a fájlt és írja

    Szerk.: Közben már látom megtaláltad a jó megoldást, de akkor a posztom alapján már érted, hogy az előző miért nem ment. :)

  • dabadab
    titán

    bw.write van, megpróbáltam szimplán FileWriterrel is, de akkor sem változik semmi.

    Eclipse-ből futtatom, ha ez számít. A bin mappában létrejön a fájl, de üres. (ha létrejön, akkor kell is lennie benne valaminek, kap inputot)

    Ja, nem kellett volna ennyit bor a vacsorahoz :D (Mondjuk jelen esetben a BufferedWriternek sok ertelme nincs, az akkor jonne jol, ha sok kis irasod lenne, ha egyszer irsz csak, akkor csak lassit.)
    (Egyebkent a logFile-t mindenestul is atadhatod neki, fogad File-t is a FileWriter konstruktora.)

    Exceptiont sem dob?

  • dabadab
    titán

    Üdv!

    Egy saját "loggert" használok és console mellett fájlba is szeretném kiírni. A fájlt létrehozza sikeresen, de egyszerűen nem ír bele semmit. Mi lehet a gond?

    public class Logger {
    private static File logFile = new File(ClassLoader.getSystemClassLoader().getResource(".").getPath()+"log.txt");

    public static void log(Object s) {
    if(!Settings.logging) return;
    //console
    System.out.println("L: "+s);

    //file
    try {
    if(!logFile.exists()){
    logFile.createNewFile();
    }
    FileWriter fw = new FileWriter(logFile.getName(),true);
    BufferedWriter bw = new BufferedWriter(fw);
    bw.newLine();
    bw.write(s.toString());
    bw.close();
    fw.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    Gondolom egy fw.write(s.toString()); sor sokat lenditene a dolgokon :DDD

  • emvy
    félisten

    próbálta már valaki a VS "code" (ingyenes, Linuxon is futó) verzióját? én vagyok béna vagy tényleg nem tud java-t futtatni?

    Igen, probaltam. Java-ra csak editorkent hasznalhato. (Alapvetoen a VS Code egy editor, nem egy IDE.)

  • plaschil
    aktív tag

    Próbáld a webdrivert :) Nekem működött amit korábban írtam.

    Mit keresel egyébként? Nem felejtetted el az inputot másra cserélni? (pl div)

    Megvan! :))
    Biztos valami új verzió miatt, de már nem kell elé az xpath= csak simán így: //input[contains(@id,'TextBox_szerzodes')]
    Plusz lassítani kellett a lejátszáson, mert hiába volt a szintaxisa megfelelő, akkor is hibára futott.

    Következő kérdés: mivel nyílhatnak egymásra panelek (akár több is, úgy képzeljétek el mint egy vastagkliensben) ezért lehetséges az, hogy pl. akár több "Save" gomb is legyen, mind különböző, de dinamikus ID-val. Így mivel tudom megkülönböztetni őket? Class? Esetleg van lehetőség ezzel a fenti megoldással ÉS kapcsolatba fűzni még feltételt, hogy pontosan melyik "Save" gombot akarom megnyomni?
    (A "Save" csak egy példa, a szemléltetés miatt)

    Első megközelítésben így gondolkodom. Az egyedi ID témát hagyjuk, mert az egész motor így működik.

    Köszönöm az eddigi helpet, értem miért kopaszodik az összes fejlesztő. :B

    Ja! Options->Clipboard format mire való? :U

  • plaschil
    aktív tag

    Próbáld a webdrivert :) Nekem működött amit korábban írtam.

    Mit keresel egyébként? Nem felejtetted el az inputot másra cserélni? (pl div)

    Azt amit itt írtam.

  • plaschil
    aktív tag

    System.out.println(driver.findElement(By.xpath("//input[starts-with(@id,'TextBox_')]")).getText());

    Én egyelőre csak az IDE-t próbálgattam, lehet emiatt elbeszéltünk egymás mellett. De úgy látom ez egy kalap sz*r. Ki fogom próbálni a WebDriver-t is.

  • Aethelstone
    addikt

    szóval a megoldás az marad ha minden lépés előtt ellenőrzöm a flaget
    köszönöm

    Gracefully módon nem tudod megoldani. Rondán meg lehet oldani, de az nem szép :)

  • #03372544
    törölt tag

    Üdv!

    A lenti kód (természetesen más szöveggel) azt hivatott bemutatni jelenleg hogy indítok el egy job-ot a lenyomott menü szövege alapján. Van erre valami elegánsabb megoldás? (a menü elemek a saját action commandjukat küldik egy listenernek)

    [azon kívül hogy elrejtem valami hasonló metódusba:
    getJob(String jobname).run(); ]

    if(owner.getAction().name().equals("Do this then that") new WorkerJobDoThisThenThat.run();
    if(owner.getAction().name().equals("Start something") new WorkerStartSomething.run();
    if(owner.getAction().name().equals("Execute this") new WorkerExecuteThis.run();
    if(owner.getAction().name().equals("Running out of ideas") new WorkerRunningOutOfIdeas.run();

    :R

    Ilyesmire gondolt a kolléga.

    package example;

    public interface Job {

    void doTheJob();

    }

    -------------------------------------------------------------------------------------------------------------------------

    package example;

    public class ExecuteThisJob implements Job {

    @Override
    public void doTheJob() {
    System.out.println("ezt végrehajtom");
    }

    }

    -------------------------------------------------------------------------------------------------------------------------

    package example;

    public class RunningOutOfIdeasJob implements Job {

    @Override
    public void doTheJob() {
    System.out.println("nincs több ötletem");
    }

    }

    -------------------------------------------------------------------------------------------------------------------------

    package example;

    public class StartSomethingJob implements Job {

    @Override
    public void doTheJob() {
    System.out.println("valamit elindítok");
    }

    }

    -------------------------------------------------------------------------------------------------------------------------

    package example;

    import java.util.HashMap;
    import java.util.Map;

    public class JobFactory {

    private static final JobFactory INSTANCE;

    static {
    INSTANCE = new JobFactory();
    }

    private Map<String, Job> jobMapping;

    private JobFactory() {
    jobMapping = new HashMap<String, Job>();
    jobMapping.put("executeThis", new ExecuteThisJob());
    jobMapping.put("startSomething", new StartSomethingJob());
    jobMapping.put("runningOutOfIdeas", new RunningOutOfIdeasJob());
    }

    public static Job getJob(String jobType) {
    return INSTANCE.jobMapping.get(jobType);
    }

    }

    -------------------------------------------------------------------------------------------------------------------------

    package example;

    public class JobFactoryExample {

    private JobFactoryExample() {
    }

    public static void main(String[] args) {
    JobFactoryExample example = new JobFactoryExample();

    example.doTheAction("executeThis");
    example.doTheAction("startSomething");
    example.doTheAction("runningOutOfIdeas");
    }

    public void doTheAction(String actionName) {
    JobFactory.getJob(actionName).doTheJob();
    }

    }

  • #03372544
    törölt tag

    Köszönöm.

    Egy újabb kérdésem lenne: adott egy osztály ami Runnable-t implementál sok hosszú egymást követő folyamatból áll. Hogyan tudnám megszakítani a futását?
    While-ba rakva a flaget változtatva csak akkor áll meg, ha már a végére ért.

    ezt próbáltam:

    public void run() {
    while(!Thread.currentThread().isInterrupted()) {
    //do time consuming stuff
    }
    }
    public void stop() {
    Thread.currentThread().interrupt();
    }

    Sehogy, az interrupt() csak beállít egy flag-et amit neked kell futás közben ellenőrizned az isInterrupted() metódussal.
    Egy-az-egyben kilőni a szálat nem tudod, régen lehetett a stop() metódussal de az elég sok problémát felvet ezért későbbi Java verziókban deprecated lett majd ki is vették, UnsupportedOperationExcepcion-t dob hogy véletlenül se használd.

  • WonderCSabo
    félisten

    Üdv!

    A lenti kód (természetesen más szöveggel) azt hivatott bemutatni jelenleg hogy indítok el egy job-ot a lenyomott menü szövege alapján. Van erre valami elegánsabb megoldás? (a menü elemek a saját action commandjukat küldik egy listenernek)

    [azon kívül hogy elrejtem valami hasonló metódusba:
    getJob(String jobname).run(); ]

    if(owner.getAction().name().equals("Do this then that") new WorkerJobDoThisThenThat.run();
    if(owner.getAction().name().equals("Start something") new WorkerStartSomething.run();
    if(owner.getAction().name().equals("Execute this") new WorkerExecuteThis.run();
    if(owner.getAction().name().equals("Running out of ideas") new WorkerRunningOutOfIdeas.run();

    :R

    Berakhatod egy Map-be, de egyébként ez tipikusan a Factory minta.

Új hozzászólás Aktív témák

Hirdetés