Diskuze: Problém s vlákny(pravděpodobně synchronizace)
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
NullPointerException, tzn. jsi někde nezinicializoal proměnnou. Jaký řádek je u tebe v IDE označen číslem 19 (je to v metodě run)? Tam najdeš chybné volání metody na objektu, který vlastně "neexistuje".
Jenom... zde bych ti doporučil si přečíst něco o zapouzdření. Jak jsem říkal, někde nemáš zinicializovanou proměnnou. Je to způsobno tím, že objekty pravděpodobně dosazuješ z vnějšku třídy přímo, a zároveň můžeš zavolat metodu run() dříve, než bude všechno připraveno. Proto by bylo lepší si ony důležité objekty (atributy) nastavit jako privátní (ucet, okno, bankomat), vytvořit ke třídě konstruktor a doplnit je tam (předání přes parametry konstruktoru). Tím si zajistíš, že pokaždé, když si vytvoříš nové vlákno tohoto typu, tak bude vše připraveno k použití a následnému zavolání metody run()
Error je na řádek s ucet.cas(); takže do run a vlákno zapínám až jako poslední. A zkontroloval sem si pomocí vypsaní do konzole že ty proměné jsou inicializované
Jiné vysvětlení, než že tam máš null, není.
BTW: měnit vlastnosti objektům ve scéně z jiného než aplikačního
vlákna je zakázáno.
To platí ve Swingu i v JavaFX
Ano, už sem vyrešil tu inicializaci že sem musel udělat rovnou
int penize = 5000;
//takhle všechny
ale tady mám další error.. Nějaká rada jak tedy aktualizovat ty staty?
Tohle je špatně, nejen z hlediska vláken, ale i z hlediska objektově orientovaného návrhu aplikace. Pominu teďka to OOP a zaměřím se na vlákna.
Vlastní vlákno pomocí rozšíření Thread se pro periodicky se opakující akce obvykle nedělá, od toho je tu Timer - https://docs.oracle.com/…g/Timer.html
Vlákna pomocí rozšíření Thread se obvykle dělají, když předem nevíš jak přesně dlouho nějaká akce bude trvat, a tak chceš, aby ta akce běžela na pozadí a neblokovala například ui.
No musíš inicializovať aj objekty ucet, okno a bankomat v triede Vlakno, preto ti vyhodí tu chybu lebo sú null. A tie Swingové metódy by si mal volať na EDT, nejak takto.
public void update(final Vlakno vlakno) {
SwingUtilities.invokeLater(() -> {
money.setText("Peníze: " + ucet.penize);
ucetMoney.setText("Stav účtu: " + ucet.penizeUcet);
prijem.setText("Čas: " + vlakno.i);
});
}
Mimochodom, ten kód píšem z mobilu takže tam môžu byť chyby.
Zobrazeno 10 zpráv z 10.