hun*_*rge 0 java multithreading
我有一个游戏,创造了'机器人',漫无目的地漫游在地图上.每次玩家点击按钮时,都会创建一个创建机器人的新线程.如果多次按下按钮,则会使用相同的线程名称botThread创建多个机器人.
但是我想能够区分机器人,所以我可以停止个人机器人.所以我使用setName()函数将第一个机器人的名称更改为"Bot 1",但如果我尝试Bot1.stop(),它说线程不存在?(我知道我不应该使用.stop()方法).
但是,如果我在线程中出现错误,则会显示"线程中的异常"Bot 1"".所以它显然确实存在!
这是我的一些代码:
public class botGame{
Thread botThread;
public void newBot(){
botThread = new Thread(new Runnable(){
public void run(){
botThread.setName("Bot 1");
Run Code Online (Sandbox Code Playgroud)
线程名称只是调试代码的有用标识符.它与应用程序中的任何变量,对象或标识符完全无关.
换句话说:呼叫thread.setName("foo")并不会神奇地让你打电话foo.stop().
您想要做的是将Thread您在某些集合或地图中创建的对象保存在那里,然后从那里检索它并对其进行操作(理想情况下不使用stop(),如您所述).
例如,botThread您可以使用以下内容代替单个字段:
Collection<Thread> botThreads = new ArrayList<Thread>();
Run Code Online (Sandbox Code Playgroud)
当你开始一个线程时,你这样做:
Thread botThread = new Thread( ... );
botThread.start();
botThreads.add(botThread);
Run Code Online (Sandbox Code Playgroud)
因为我们的主题是避免停止:如果你不坚持Thread对象,而是坚持BotRunnable,你可以添加一个pleaseStop方法来BotRunnable设置一个volatile boolean名为keepRunning(或类似)的字段false.然后,在run方法内部,定期检查该字段,如果是false,则返回.