Java中如何从线程池中将线程移除?

类A实现Runnable接口
ArrayList<Thread> threadPool = new ArrayList<Thread>();
A a = new A();
threadPool.add(new Thread(a));
现在要从threadPool中将a对应的线程移除,应该如何操作?

第1个回答  2017-03-27
线程池中的线程称为worker,它是功能就是生产者-消费都模式中的消费者,有个同步锁在请求队列上等待请求数据,我们只要把数据放入请求队列中它就能开始工作,当没有数据时又回到那么锁上等待,也就是那个 run 方法是应该进行一个循环的,一般情况下是根据一个退出条件来决定是否退出,如果不退出那就是一个无限循环。
第2个回答  2017-03-27

按照你的逻辑,你用ArrayList作为一个线程池,实际上这是一个集合,如果想移除,可以这样:

threadPool.remove(new Thread(a));

但是实际上,java中的concurrent包下的Executors接口,使用自带的api:

 ExecutorService threadpool=Executors.newCachedThreadPool();

追问

我并没有使用java中提供的线程池类接口,而是自己定义的threadPool,可以认为仅仅是ArrayList(),这个如果要移除该如何操作那?

追答

那么你就可以调用Arraylist的方法进行移除,remove(int index),根据位置移除,或者remove(object o),根据对象移除,或者clear(),清除所有线程

追问

现在的困难就是无法获得这个对象,添加的时候是通过threadPool.add(new Thread(a));移除的时候,我现在只能获得a,是否有方法通过a获取相应的thread那?

追答

和a没有关系啊,a只是你为了实现Runnable接口,然后通过Thread()构造的一个线程,你只要操作构造号的这个线程就行了。a不用考虑,看是不是这样的:
Thread threada=new Thread(a);
threadPool.add(threada);
threadPool.remove(threada);

本回答被提问者和网友采纳
第3个回答  2018-12-17
不需要a直接
threadPool.remove(this);
相似回答