Это просто простой пример того, как вы МОЖЕТЕ реализовать это:
код, который необходимо запустить в отдельном потоке, должен быть инкапсулирован в класс, реализующий интерфейс java.lang.Runnable
,внутри это public void run()
метод. Таким образом, в вашем случае, это была «сложная» логика переворота - сложные, сложные вычислительные вещи никогда не должны происходить на Swings, так называемом Event Dispatch Thread (EDT)
, потому что это может заморозить ваш GUI и не будет выглядеть гладко; -)
следующая важная часть: вызовите связанные с пользовательским интерфейсом операции в потоке диспетчеризации событий ... этого можно достичь, вызвав SwingUtilities.invokeLater()
Для простоты и краткостив этом примере я создал подкласс javax.swing.JLabel
и позволил ему реализовать интерфейс java.lang.Runnable
. В классе CoinFlipApp
я получил экземпляр ExecutorService
- думайте о нем как о пуле потоков. Чтобы выполнить вещи в отдельных потоках с помощью этого пула потоков, вы должны передать ему Runnable
, который затем будет запланирован для выполнения. Это происходит по телефону executorService.submit(coinFlip);
import javax.swing.SwingUtilities;
public class CoinFlipApp extends JFrame {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
SwingUtilities.invokeLater(() -> {
JFrame f = new JFrame();
LayoutManager layoutManager = new BoxLayout(f.getContentPane(), BoxLayout.LINE_AXIS);
f.getContentPane().setLayout(layoutManager);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
f.setVisible(true);
for (int i=0, j=5; i<j; i++) {
CoinFlip coinFlip = new CoinFlip();
f.getContentPane().add(coinFlip);
executorService.submit(coinFlip);
}
});
}
}
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class CoinFlip extends JLabel implements Runnable {
@Override
public void run() {
final String value = Boolean.toString(randomBoolean()).toUpperCase();
SwingUtilities.invokeLater(() -> {
CoinFlip.this.setText(value);
CoinFlip.this.repaint();
});
}
private boolean randomBoolean() {
try {
// this can be removed later
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return Math.random() < 0.5;
}
}