1 svar
35 visningar
sampledragon5 är nöjd med hjälpen
sampledragon5 495
Postad: 15 feb 15:12

Trådar

När jag trycker i en tangent så rör sig den blåa boxen (JLabel) samt så printas "t1" medan jag trycker i en tangent... MEN om jag tar bort System.out.println() från run() funktionen, då rör sig endast den blåa boxen när jag trycker i en tanget, dvs. "t1" printas inte. Jag undrar varför System.out.println() behövs in run() funktionen för att "t1" ska printas. Jag fattar att thread1 kör while(true) loopen MÅNGA gånger... MEN jag fattar inte varför thread1 behöver "vila" ( Thread.sleep(1000)) för att koden sa fungera. Snälla förklara på en sådan sätt så att jag förstår varför thread1 behöver vila för att koden ska printa "t1" när jag trycker i en tangent 😭 ( vad exakt är det som sker i CPU:n som orsakar detta)

 

public class TimerLesson implements Runnable, KeyListener {

private static JFrame frame;

private static JLabel spaceShip_label;


private static boolean key_pressed = false;

private TimerLesson() {
frame = new JFrame();
frame.setSize(500, 500);
frame.setLayout(null);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

spaceShip_label = new JLabel();
spaceShip_label.setBounds(300, 300, 100, 100);
spaceShip_label.setBackground(Color.blue);
spaceShip_label.setOpaque(true);

spaceShip_label.setFocusable(true);
spaceShip_label.requestFocusInWindow();
spaceShip_label.addKeyListener(this);

frame.add(spaceShip_label);
frame.setVisible(true);
}

@Override
public void run() {
while (true) {
if (key_pressed) {
System.out.println("t1");
}

// om denna print statement tas bort, så slutas "t1" printas när jag trycker i en tanget.

System.out.println();

}
}


public static void main(String[] args) throws InterruptedException {
TimerLesson tl = new TimerLesson();
Thread thread1 = new Thread(tl);
thread1.start();

 

}

@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyPressed(KeyEvent e) {
key_pressed = true;

spaceShip_label.setLocation(spaceShip_label.getX() - 1, spaceShip_label.getY());
}

@Override
public void keyReleased(KeyEvent e) {
key_pressed = false;

}
}

Macilaci 2107
Postad: 15 feb 23:10

Ja, det är en helt adekvat reaktion att gråta. Java (och trådar i allmänhet) är komplicerat.

Här uppdaterar en tråd variabeln key_pressed och en annan tråd försöker läsa den. Och det ger upphov till ett problem som kallas "Trådsynkronisering", särskilt synlighet.

Här kan du läsa mer om det: https://www.baeldung.com/java-volatile

Som artikeln säger, nyckelordet "volatile" löser problemet i ditt fall.

Svara Avbryt
Close