线程不起作用

时间:2018-03-31 15:14:48

标签: java multithreading swing game-physics

我在java中创建了两个Threads,带有while循环,但是当我运行程序时只有一个Thread工作,为什么?主要的问题是我创造了一个飞扬的鸟类视频游戏,并且在线程中我生成了障碍物,而在另一个线程中我移动了障碍物。 Here有一个飞扬的鸟类游戏物理的例子

import javax.swing.*;
import java.awt.*;
import java.util.Vector;
import java.util.concurrent.ThreadLocalRandom;

public class main {
    public static void main(String [] args){
        int altezza_frame = 900;
        int larghezza_frame  = 800;
        int gap = 150;
        int intervallo = 200;
        Vector <JLabel> alti = new Vector<JLabel>();
        Vector <JLabel> bassi = new Vector<JLabel>();
        JFrame pannello = new JFrame();
        Thread inizializza = new Thread(){
            @Override
            public void run() {
                pannello.setSize(larghezza_frame , altezza_frame);
                pannello.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                pannello.setLayout(null);
                pannello.setResizable(true);
                pannello.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("icona.png")));
                Color cielo = new Color(66, 203, 244);
                pannello.getContentPane().setBackground(cielo);
                pannello.setVisible(true);
            }
        };
        Thread ostacoli = new Thread(){
            @Override
            public void run() {
                Color verde = new Color(116, 181, 43);
                alti.setSize(1);
                bassi.setSize(1);
                int x = 0;
               while (true){
                    JLabel alto = new JLabel();
                    int altezza = ThreadLocalRandom.current().nextInt(100, 450 + 1);
                    alto.setSize(100, altezza);
                    alto.setOpaque(true);
                    alto.setBackground(verde);
                    alto.setLocation(x, 0);
                    JLabel basso = new JLabel();
                    basso.setSize(100, altezza_frame - altezza - gap);
                    basso.setOpaque(true);
                    basso.setBackground(verde);
                    basso.setLocation(x, altezza + gap);
                    pannello.add(basso);
                    pannello.add(alto);
                    alti.add(alto);
                    bassi.add(basso);
                    alti.setSize(alti.size()+1);
                    bassi.setSize(bassi.size()+1);
                    x+=(100+intervallo);
                }
            }
        };
        Thread muovi_ostacoli = new Thread(){
            @Override
            public void run() {
                while (true){
                    for(int x=0;x<alti.size();x++){
                       System.out.print("ciao");
                    }
                }
            }
        };
        inizializza.run();
        ostacoli.run();
        muovi_ostacoli.start();
    }
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您正在使用.run()执行主题inizializza和ostacoli。这不会开始它们,但会在当前线程中运行它们。使用.start()启动线程。见here