停止特定的java线程

我有一个按钮“addCashier”,它正在创建一个名为“Cashier”的线程,现在这个线程只是每4秒生成一次订单,在线程的run()方法中有一个while(true)循环。 一切都很好,但现在我想添加一个按钮来模拟收银员注销。 我在我的while循环onDuty和一个公共函数logOff()中添加了一个布尔变量,它将onTuty bool设置为false以使我退出运行的while循环。 我现在的问题是来自我的gui类如何在特定线程上调用函数? 每个收银员线程都是在运行时生成的,所以我不知道他们的名字。

我希望我有道理。 提前致谢。

 Thread t = CashierThread(); //keep the reference to thread somewhere... 

现在使用内置中断标志而不是布尔属性:

 public void run() { while(!Thread.currentThread().isInterrupted()) { //... } } 

当您想通过单击按钮来转动线程时,只需调用:

 t.interrupt(); 

当然,您需要从客户端代码访问t变量。

您可以将每个线程的引用存储到HashMap – 以及其idName作为键。 稍后当您想要处理一个特定的Cashier线程时,使用Nameid从HashMap中获取相应的Thread并在其上调用相应的logOff()方法。

如果收集对所有线程的引用是一个问题,另一种方法可能是拥有一个公共静态同步HashMap,它具有threadId(在运行时为每个线程分配的随机数)作为键,布尔值作为值。 您可以修改while循环以从此集中式Map中选择相应的布尔值。 这将允许您注销特定的收银员。

您可以在某处保留Thread对象的引用,以便您可以调用threadObj.logOff()

如果您不愿意这样做,那么在创建一个thred时你可以为该线程分配一个唯一的名称。

 public void run () { this.setName(strCashireID); ...... } 

在运行时,您可以通过以下方式获取该线程:

 Thread getThread(String strCashireID) { ThreadGroup threadGroup = Thread.currentThread( ).getThreadGroup( ); Threads[] threads = new Thread[ threadGroup.activeCount() ]; threadGroup.enumerate(threads); for (int nIndex=0; nIndex 

我仍然建议你将线程对象存储在哈希映射中,而不是在运行时枚举它们。