我有两个类,第一个负责创建线程,然后需要从第二个类通知那些线程问题:我无法从第二个类中找到创建的线程,getThreadByName() 总是返回 null,Any Idea?。头等舱public class class1{ protected void createThread(String uniqueName) throws Exception { Thread thread = new Thread(new OrderSessionsManager()); thread.setName(uniqueName); thread.start(); }}订单会话管理器public class OrderSessionsManager implements Runnable {public OrderSessionsManager() {}@Overridepublic void run() { try { wait(); }catch(Exception e) { e.printStackTrace(); }}二等舱public class class2{ protected void notifyThread(String uniqueName) throws Exception { Thread thread = Utils.getThreadByName(uniqueName); thread.notify(); }}实用程序public class Utils{ public static Thread getThreadByName(String threadName) { ThreadGroup currentGroup = Thread.currentThread().getThreadGroup(); int noThreads = currentGroup.activeCount(); Thread[] threads = new Thread[noThreads]; currentGroup.enumerate(threads); List<String>names = new ArrayList<String>(); for (Thread t : threads) { String tName = t.getName().toString(); names.add(tName); if (tName.equals(threadName)) return t; } return null; }}
1 回答
交互式爱情
TA贡献1712条经验 获得超3个赞
您的代码有几个问题:
1) 它打破了 Java 代码约定:类名必须以大写字母开头
2) wait() 方法必须由拥有对象监视器的线程调用,因此您必须使用以下内容:
synchronized (this) {
wait();
}
3)notify() 方法必须由拥有对象监视器的线程和与 wait() 相同的对象调用,在您的情况下是 OrderSessionsManager 的实例。
4) 由于您没有指定 ThreadGroup,线程从它的父线程获取它的 ThreadGroup。以下代码按预期工作:
public class Main {
public static void main(String[] args) {
class1 c1 = new class1();
try {
c1.createThread("t1");
} catch (Exception e) {
e.printStackTrace();
}
Thread thread = Utils.getThreadByName("t1");
System.out.println("Thread name " + thread.getName());
}
}
但这只是因为t1线程与主线程在同一组中。
添加回答
举报
0/150
提交
取消