停止重命名的Thread

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)

Joa*_*uer 5

线程名称只是调试代码的有用标识符.它应用程序中的任何变量,对象或标识符完全无关.

换句话说:呼叫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,则返回.