停止特定的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
– 以及其id
或Name
作为键。 稍后当您想要处理一个特定的Cashier线程时,使用Name
或id
从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
我仍然建议你将线程对象存储在哈希映射中,而不是在运行时枚举它们。