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,就退出它。该方法运行良好。是的,这一行没有帮助。