一个Java线程是否可以多次存活?

4

好的....让我尽力解释一下.... 另外: 这是针对Minecraft中的一个mod。 好的,所以我创建了一个线程对象。

public static Thread KillThread = new Thread();

然后,在我的主类的构造函数中,当游戏(Mine craft)启动时调用以下内容:

KillThread = new Thread(new KillAuraThread());

KillAuraThread是一个线程类的名称。我现在创建了一个线程,但它让我感到很烦恼。这个线程将运行一秒钟,不能同时运行多次,否则会破坏延迟和线程的目的。

if(KillAura.enabled && !KillThread.isAlive())
    {
        System.out.println("Go AURA!");
        try
        {
            KillThread.start();
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }

这是游戏中每个时刻会发送位置更新等信息的称为“every tick”的操作。

现在我遇到了问题。一旦线程启动,它就变得“活跃”,当它结束时就不再是“活跃”的了。但是线程只能启动一次吗?因为第一次运行后就不再起作用了?有什么想法?链接?


https://dev59.com/6HI-5IYBdhLWcg3wYnSQ - noahlz
(也许这里有比线程更好的方法?) - user166390
不要使用线程。Minecraft已经足够资源密集型了,不需要添加大量线程来运行一秒钟就停止。像其他所有东西一样,给它一个生命周期计数器,每个tick减少一个,当它变为零时,杀死气息即可。 - Wug
KillAuraThread 是一个 Runnable 接口吗? - cat916
1
此外,在构造函数中启动线程是并发错误的常见原因。 - erickson
显示剩余2条评论
2个回答

7

是的,线程只能启动一次,您不能重复使用线程对象。

不允许启动一个线程多次。特别地,一旦线程执行完成,就不能重新启动。请参见java.lang.Thread.start()

尽管如此,请勿使用Thread.State来管理线程生命周期。


哇,好的,謝謝,這對我很有幫助...我得找一種新的方法來解決這個問題。還有感謝wug,我會試著不使用線程來做這件事。 - user1653457

5

你说得对,线程只能运行一次,重复启动或运行线程是非法的。你应该考虑使用while循环来保持线程的活力。

不要直接处理线程,而是应该使用java.util.concurrent包中的类来定期安排固定的任务,这显然是你正在尝试做的事情。看看ThreadPoolExecutor


1
在while循环中加上+1。 在循环顶部进行Wait()操作应该可以 - 只需在想要终止Aura时进行Notify()操作。 - Martin James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接