Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅当队列中有内容时才消耗cpu的工作线程_Java_Multithreading_Queue - Fatal编程技术网

Java 仅当队列中有内容时才消耗cpu的工作线程

Java 仅当队列中有内容时才消耗cpu的工作线程,java,multithreading,queue,Java,Multithreading,Queue,这就是我要做的 我想要一个对象,它有一个队列并启动一个线程。另一个线程可以通过执行object.addWork(work)推送到该队列 这将把工作推到队列中,并在线程处于休眠状态时唤醒它。然后,线程对队列中的每个对象执行工作,直到队列为空 一旦队列为空并且没有剩余工作,该线程将休眠,需要通过再次添加到队列来唤醒该线程 有没有线程安全的方法来创建这样一个对象?您基本上想要的是执行器。newSingleThreadExecutor可以做什么 class YouNameIt{ private

这就是我要做的

我想要一个对象,它有一个队列并启动一个线程。另一个线程可以通过执行object.addWork(work)推送到该队列

这将把工作推到队列中,并在线程处于休眠状态时唤醒它。然后,线程对队列中的每个对象执行工作,直到队列为空

一旦队列为空并且没有剩余工作,该线程将休眠,需要通过再次添加到队列来唤醒该线程


有没有线程安全的方法来创建这样一个对象?

您基本上想要的是
执行器。newSingleThreadExecutor
可以做什么

class YouNameIt{
    private ExecutorService executor;

    public void start(){
        executor = Executors.newSingleThreadExecutor();
    }

    public void put(Object o){
        executor.submit(new Runnable() {
            @Override
            public void run() {
                process(o);
            }
        });
    }

    private void process(Object o) {
        //Put your processing here
    }

    public void stop(){
        executor.shutdown();
    }
}

基本上,您想要的是执行者所能做的

class YouNameIt{
    private ExecutorService executor;

    public void start(){
        executor = Executors.newSingleThreadExecutor();
    }

    public void put(Object o){
        executor.submit(new Runnable() {
            @Override
            public void run() {
                process(o);
            }
        });
    }

    private void process(Object o) {
        //Put your processing here
    }

    public void stop(){
        executor.shutdown();
    }
}

您基本上需要一个
阻塞队列
;这就是这个接口(和实现)要做的事情。@fge说的——选择BlockingQueue的任何实现和ExecutorService的任何实现您基本上想要一个
BlockingQueue
;这就是这个接口(和实现)要做的事情。@fge说的——选择BlockingQueue的任何实现和ExecutorService的任何实现