我的情况如下,我有很多对象,每个对象需要与一个单独的线程相关联。当对象被丢弃时,也需要终止相应的线程。考虑一下这样的情况,即有些机器人在某些迷宫中独立运行,其中一些可能会在一段时间后死亡,需要移除相应的线程。
所以这里有一些用于创建对象和线程的示例代码(它可以以与后面描述的对象包装器不同的方式完成),
List<MyObject> objects = new ArrayList();
List<Thread> threads = new ArrayList();
for(int i = 0; i < 10000/* could be arbitrary large number*/; i++){
MyObject obj = new MyObject();
threads.add(new Thread(){
@Override
public void run(){
// do something with obj
}
});
}
一旦从列表中删除了对象,线程也应该被终止,所以在这里我有一个直观的想法,我创建一个地图作为线程管理器来管理它,
List<MyObject> objects = new ArrayList();
List<Thread> threads = new ArrayList();
Map<MyObject, Thread> threadManager = new HashMap();
for(int i = 0; i < 10000/* could be arbitrary large number*/; i++){
MyObject obj = new MyObject();
Thread thread = new Thread(){
@Override
public void run(){
// do something with obj
}
};
threads.add(thread);
threadManager.put(obj, thread);
}
所以现在如果obj从列表中删除,我可以在地图中找到该条目并停止该线程。另一个想法是将对象创建为Runnable,因此该对象将是该线程的包装器。
public class MyObject implements Runnable {
private volatile flag = true;
public void run(){
while(flag){//do somehting}
}
public void shutdown(){
flag = false;
}
}
因此,当从列表中删除obj时,只需为它调用shutdown。
所以我的问题是哪个更好?是否有更优雅的方式来做到这一点?