线程与对象包装器或线程管理器?

时间:2017-04-27 01:21:28

标签: java multithreading

我的情况如下,我有很多对象,每个对象需要与一个单独的线程相关联。当对象被丢弃时,也需要终止相应的线程。考虑一下这样的情况,即有些机器人在某些迷宫中独立运行,其中一些可能会在一段时间后死亡,需要移除相应的线程。

所以这里有一些用于创建对象和线程的示例代码(它可以以与后面描述的对象包装器不同的方式完成),

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。

所以我的问题是哪个更好?是否有更优雅的方式来做到这一点?

0 个答案:

没有答案