Java ExecutorService暂停/恢复特定线程

Ric*_*tos 10 java concurrency multithreading executorservice threadpool

有没有办法使用ExecutorService来暂停/恢复特定的线程?

private static ExecutorService threadpool = Executors.newFixedThreadPool(5);

想象一下,我想要停止作为id = 0的线程(假设为每个线程分配一个增量id,直到达到线程池的大小).

过了一会儿,按一个按钮让我们说,我想恢复那个特定的线程并让所有其他线程保持其当前状态,可以暂停或恢复.

我在Java文档中找到了一个未完成的PausableThreadPoolExecutor版本.但它不适合我需要的东西,因为它恢复了池中的所有线程.

如果没有办法使用ExecutorService的默认实现,那么任何人都可以指出这个问题的Java实现吗?

谢谢!

Cra*_*lus 7

你走错了路.线程池拥有线程,并通过与代码共享它们可能会搞砸.
您应该专注于完成任务(传递给线程可取消/可中断),而不是直接与池拥有的线程交互.
另外,当你试图中断线程时,你不知道正在执行什么工作,所以我不明白为什么你会这样做

更新:
取消在线程池中提交的任务的正确方法是通过Future执行程序返回的任务.
1)你肯定知道你真正的目的是试图任务被取消这样
2)如果你的任务已经被设计为撤销那么你有没有一半
3)不要使用标志来表明取消,但使用Thread.currentThread().interrupt()替代

更新:

public class InterruptableTasks {  

    private static class InterruptableTask implements Runnable{  
        Object o = new Object();  
        private volatile boolean suspended = false;  

        public void suspend(){          
            suspended = true;  
        }  

        public void resume(){       
            suspended = false;  
            synchronized (o) {  
                o.notifyAll();  
            }  
        }  


        @Override  
        public void run() {  

            while(!Thread.currentThread().isInterrupted()){  
                if(!suspended){  
                    //Do work here      
                }
                else{  
                    //Has been suspended  
                    try {                   
                        while(suspended){  
                            synchronized(o){  
                                o.wait();  
                            }                           
                        }                       
                    }  
                    catch (InterruptedException e) {                    
                    }             
                }                           
            }  
            System.out.println("Cancelled");        
        }

    }

    /**  
     * @param args  
     * @throws InterruptedException   
     */  
    public static void main(String[] args) throws InterruptedException {  
        ExecutorService threadPool = Executors.newCachedThreadPool();  
        InterruptableTask task = new InterruptableTask();  
        Map<Integer, InterruptableTask> tasks = new HashMap<Integer, InterruptableTask>();  
        tasks.put(1, task);  
        //add the tasks and their ids

        Future<?> f = threadPool.submit(task);  
        TimeUnit.SECONDS.sleep(2);  
        InterruptableTask theTask = tasks.get(1);//get task by id
        theTask.suspend();  
        TimeUnit.SECONDS.sleep(2);  
        theTask.resume();  
        TimeUnit.SECONDS.sleep(4);                
        threadPool.shutdownNow();      
    }
Run Code Online (Sandbox Code Playgroud)