Java 当我实例化一个新线程时,main方法终止

Java 当我实例化一个新线程时,main方法终止,java,java-threads,Java,Java Threads,我正在编写一个自上而下的射击游戏,我想在游戏的每个关卡之间打开一个新窗口。在每个级别之后,如果满足特定标准,则实现以下类: import java.util.*; import javax.swing.*; import java.awt.*; import java.awt.Image.*; import java.awt.image.BufferedImage.*; import java.text.*; import java.awt.event.*; import javax.swing

我正在编写一个自上而下的射击游戏,我想在游戏的每个关卡之间打开一个新窗口。在每个级别之后,如果满足特定标准,则实现以下类:

import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.Image.*;
import java.awt.image.BufferedImage.*;
import java.text.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.border.*;
import javax.swing.text.*;
import javax.imageio.ImageIO;
import java.io.InputStream.*;
import java.io.*;

public class Shop extends JFrame implements Runnable
{
    private static java.awt.image.BufferedImage shotgun, zombie, armor, aRifle;
    static ArrayList<Image> stock = new ArrayList<Image>();
    private ColorPanel contentPane3;
    private JPanel container = new JPanel();
    private JPanel contentPane4;
    private int item=0;
    private boolean broke = false;
    private boolean newb = true;
    private boolean reg = false;
    private boolean stay = true;

    public static void main(String [] args)
    {
        System.out.println("started");
        Thread s = new Thread( new Shop () );
        System.out.println("running");
        s.start();
        System.out.println("ended");
    }

    public Shop()
    {        
        super("Monster Escape v4");

        try
        {
            shotgun = ImageIO.read(getResource("shotgun.png"));        
            zombie = ImageIO.read(getResource("zombie.png"));        
            armor = ImageIO.read(getResource("armor.png"));
            aRifle = ImageIO.read(getResource("assaultRifle.png"));
        }catch (IOException e){System.exit(0);}

        stock.clear();
        stock.add(armor);
        if(!(Client.inventory.contains("shotgun")))
            stock.add(shotgun);            
        if(!(Client.inventory.contains("assaultRifle")))
            stock.add(aRifle);

        container.removeAll();

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        contentPane4 = new JPanel();
        contentPane4.setPreferredSize(new Dimension( 700,100 ));
        contentPane3 = new ColorPanel(Color.WHITE);
        contentPane3.setPreferredSize(new Dimension( 700,700 ));
        setBounds( 100,100,606,719 );
        setResizable(false);

        GridLayout g1 = new GridLayout(1, 3);
        contentPane4.setLayout(g1);
        container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));

        JButton sleft = new JButton("←");
        JButton sright = new JButton("→");
        JButton buy = new JButton("buy");
        JButton leave = new JButton("leave");

        contentPane4.add(sleft);
        contentPane4.add(buy);
        contentPane4.add(sright);
        contentPane4.add(leave);

        sleft.addActionListener((e) -> {
            broke = false;
            newb = false;
            if(item==0)
                item = stock.size()-1;
            else
                item--;
        });

        sright.addActionListener((e) -> {
            broke = false;
            newb = false;
            if(item==stock.size()-1)
                item=0;
            else
                item++;
        });

        buy.addActionListener((e) -> {
            broke = false;
            newb = false;
            if(stock.get(item) == armor)
            {
                if(Client.cash >= 100)
                {
                    Client.maxHealth += 4;
                    Client.cash -= 100;
                    reg = true;
                }
                else
                    broke = true;
            }
            else
            {
                if(Client.cash >= 250)
                {
                    Client.inventory.add(getName(item));
                    stock.remove(item);
                    Client.cash -= 250;
                    item--;
                    reg = true;
                }
                else
                    broke = true;
            }

        });

        leave.addActionListener((e) -> {
            stay = false;
        });

        container.add(contentPane3, BorderLayout.EAST);
        container.add(contentPane4, BorderLayout.WEST);
        setContentPane(container);



        setVisible(true);
    }

    public static String getName(int i)
    {
        String temp = null;
        if(stock.get(i) == armor)
            temp = "armor";
        else if(stock.get(i) == shotgun)
            temp = "shotgun";
        else if(stock.get(i) == aRifle)
            temp = "assaultRifle";
        return temp;
    }

    private InputStream getResource(String ref) throws IOException
    {
        InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(ref);
        if( in != null )
            return in;
        return new FileInputStream(ref);

    }

    public void run()
    {


        while(stay)
        {
            repaint();

            try
            {
                Thread.sleep(10);
            }catch( InterruptedException e ) { }

        }
        dispose();
    }


}
import java.util.*;
导入javax.swing.*;
导入java.awt.*;
导入java.awt.Image.*;
导入java.awt.image.buffereImage.*;
导入java.text.*;
导入java.awt.event.*;
导入javax.swing.event.*;
导入javax.swing.border.*;
导入javax.swing.text.*;
导入javax.imageio.imageio;
导入java.io.InputStream.*;
导入java.io.*;
公共类Shop扩展JFrame实现Runnable
{
私有静态java.awt.image.buffereImage散弹枪,僵尸,盔甲,aRifle;
静态ArrayList stock=新ArrayList();
私有彩色面板内容窗格3;
私有JPanel容器=新JPanel();
私有JPanel内容窗格4;
私有int项=0;
私有布尔值=false;
私有布尔值newb=true;
私有布尔reg=false;
private boolean stay=true;
公共静态void main(字符串[]args)
{
System.out.println(“已启动”);
螺纹s=新螺纹(新车间());
System.out.println(“运行”);
s、 start();
系统输出打印项次(“结束”);
}
公共商店()
{        
超级(“怪物逃生v4”);
尝试
{
shotgun=ImageIO.read(getResource(“shotgun.png”);
zombie=ImageIO.read(getResource(“zombie.png”);
armor=ImageIO.read(getResource(“armor.png”);
aRifle=ImageIO.read(getResource(“assaultRifle.png”);
}catch(ioe){System.exit(0);}
stock.clear();
增加(护甲);
如果(!(Client.inventory.contains(“散弹枪”))
添加(散弹枪);
if(!(Client.inventory.contains(“assaultriff”))
股票。添加(aRifle);
container.removeAll();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane4=新的JPanel();
contentPane4.setPreferredSize(新维度(700100));
contentPane3=新的颜色面板(Color.WHITE);
contentPane3.setPreferredSize(新维度(700700));
立根(100606719);
可设置大小(假);
GridLayout g1=新的GridLayout(1,3);
contentPane4.setLayout(g1);
container.setLayout(新的BoxLayout(container,BoxLayout.Y_轴));
JButton sleft=新JButton(“←");
JButton sright=新JButton(“→");
JButton buy=新JButton(“购买”);
JButton leave=新JButton(“leave”);
contentPane4.add(sleft);
contentPane4.添加(购买);
contentPane4.add(右侧);
contentPane4.添加(休假);
sleft.addActionListener((e)->{
破=假;
newb=假;
如果(项==0)
项目=库存.尺寸()-1;
其他的
项目--;
});
sright.addActionListener((e)->{
破=假;
newb=假;
if(item==stock.size()-1)
项目=0;
其他的
项目++;
});
buy.addActionListener((e)->{
破=假;
newb=假;
如果(库存获取(物品)=护甲)
{
如果(Client.cash>=100)
{
Client.maxHealth+=4;
客户。现金-=100;
reg=真;
}
其他的
破=真;
}
其他的
{
如果(Client.cash>=250)
{
Client.inventory.add(getName(item));
库存。移除(项目);
Client.cash-=250;
项目--;
reg=真;
}
其他的
破=真;
}
});
leave.addActionListener((e)->{
停留=假;
});
container.add(contentPane3,BorderLayout.EAST);
container.add(contentPane4,BorderLayout.WEST);
setContentPane(容器);
setVisible(真);
}
公共静态字符串getName(int i)
{
字符串temp=null;
如果(库存获取(i)=装甲)
temp=“装甲”;
else if(stock.get(i)=猎枪)
temp=“猎枪”;
else if(stock.get(i)=aRifle)
temp=“突击步枪”;
返回温度;
}
私有InputStream getResource(字符串引用)引发IOException
{
InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream(参考);
if(in!=null)
返回;
返回新的FileInputStream(ref);
}
公开募捐
{
中途(停留)
{
重新油漆();
尝试
{
睡眠(10);
}捕获(中断异常e){}
}
处置();
}
}
这包括一个未显示的ColorPanel子类。在我的游戏的早期版本中,它工作得很好。但是,我最近向我的客户端添加了一个KeyListener子类,现在当我尝试实例化线程时,什么都没有发生。我在Shop类本身中创建了一个main方法,以查看问题所在,并且似乎当代码埃克斯 螺纹s=新螺纹(新车间()); 系统完全终止,因为当我运行main时,它只打印“started”。这是什么原因造成的?

添加 s、 join()


启动后。在这种情况下,主线程将等待s线程完成。

程序是否实际终止?我检查了方法调用,它显示“VM已终止”。“然而,仔细查看我的代码发现,当我试图实例化我的图像时,它捕获到了一个IOException,我告诉程序如果遇到这个IOException,就退出它。该方法运行良好。是的,这一行没有帮助。