Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.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 创建操作作业的队列_Java_Android_Queue_Rx Java2 - Fatal编程技术网

Java 创建操作作业的队列

Java 创建操作作业的队列,java,android,queue,rx-java2,Java,Android,Queue,Rx Java2,我想构建一个线程侦听队列,并在向队列添加项目时执行作业 但我不知道如何开发它。我已经尝试了一些来自RxJava2的可流动示例,但没有认识到如何做到这一点 我对Android和Java中的所有示例都持开放态度,也许消息处理程序或执行器将是一个简单的解决方案。遗憾的是,没有专门知识。特别是RxJava2将非常棒 更新 换句话说,我想在它上面建立一个队列机制,因为长日志显示为分离的,并且计时使它们在最近的时间内被调用时混合在一起 public final class Logcat { priv

我想构建一个线程侦听队列,并在向队列添加项目时执行作业

但我不知道如何开发它。我已经尝试了一些来自RxJava2的可流动示例,但没有认识到如何做到这一点

我对Android和Java中的所有示例都持开放态度,也许消息处理程序或执行器将是一个简单的解决方案。遗憾的是,没有专门知识。特别是RxJava2将非常棒

更新

换句话说,我想在它上面建立一个队列机制,因为长日志显示为分离的,并且计时使它们在最近的时间内被调用时混合在一起

public final class Logcat {

   private static final String TAG = "HOWDY";

   public static void v(String message) {
       Log.v(TAG, message);
   }

   public static void d(String message) {
       Log.d(TAG, message); 
       //TODO I will add a for-loop later for long messages to make sure to show all of them for each method.
   }

   public static void e(Throwable throwable) {
       Log.e(TAG, throwable.getMessage());
   }

   public static void e(String message) {
       Log.e(TAG, message);
   }

   public static void e(ApiError error) {
       Log.e(TAG, error.message);
   }
}
我就是这样做的

interface ILog {

   String TAG = "HOWDY";

   void display();
}
和我的抽象类

abstract class AbstractLog implements ILog {

   String mLog;

   AbstractLog(@NonNull String log) {
       mLog = log;
   }
}
这是我的具体课程;还有另一个类,如Verbose等

public class ErrorLog extends AbstractLog {

   ErrorLog(@NonNull String log) {
       super(log);
   }

   ErrorLog(@NonNull Throwable throwable) {
       super(throwable.getMessage());
   }

   ErrorLog(@NonNull ApiError error) {
       super(error.message);
   }

   @Override
   public void display() {
      Log.e(TAG, mLog);
   }
}
这是类开发人员要与之交互的

public final class Logcat {

   private static LogQueue sQueue = new LogQueue();

   public static void v(String log) {
       Message message = new Message();
       message.obj = new VerboseLog(log);

       sQueue.sendMessage(message);
   }

   public static void d(String log) {
       Message message = new Message();
       message.obj = new DebugLog(log);

       sQueue.sendMessage(message);
   }

   public static void e(Throwable throwable) {
       Message message = new Message();
       message.obj = new ErrorLog(throwable);

       sQueue.sendMessage(message);
   }

   public static void e(String log) {
       Message message = new Message();
       message.obj = new ErrorLog(log);

       sQueue.sendMessage(message);
   }

   public static void e(ApiError error) {
       Message message = new Message();
       message.obj = new ErrorLog(error);

       sQueue.sendMessage(message);
   }

   private static class LogQueue extends Handler {

       @Override
       public void handleMessage(Message msg) {
           super.handleMessage(msg);

           ILog log = (ILog) msg.obj;
           log.display();
       }
   }
}

希望这对其他人有帮助。

好的,下面是我将如何做的

import java.util.Queue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
import io.reactivex.subjects.PublishSubject;

public class DemoRxJava2 {

    public static void testWithQueue() {

        CompletableFuture<String> allDone = new CompletableFuture<>();
        AtomicBoolean submitDone = new AtomicBoolean(Boolean.FALSE);
        final Queue<Long> queue = new ConcurrentLinkedQueue<>();

        Observable.interval(2, TimeUnit.SECONDS)
        .takeWhile(tick -> !queue.isEmpty() || !submitDone.get())
        .flatMap(tick -> {
            return Observable.create(sub -> {
                while (!queue.isEmpty()) {
                    sub.onNext(queue.poll());
                }
                sub.onComplete();
            });
        })
        .subscribeOn(Schedulers.single())
        .doOnSubscribe(dis -> System.out.println("Queue processing active"))
        .doOnComplete(() -> {
            System.out.println("Queue processing done");
            allDone.complete("DONE");
        })
        .subscribe(nextTs -> System.out.printf("[%s] : Processing tx : %d\n", Thread.currentThread().getName(), nextTs));

        Observable.interval(1,TimeUnit.SECONDS)
        .take(10)
        .doOnSubscribe(dis -> System.out.println("Job submitter start"))
        .doOnNext(tick -> {
            long ms = System.currentTimeMillis() / 1000;
            System.out.printf("[%s] : Submitting tx : %d\n", Thread.currentThread().getName(), ms);
            queue.add(ms);
        })
        .doOnComplete(() -> submitDone.set(Boolean.TRUE))
        .blockingSubscribe();

        try {
            allDone.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }

    public static void testWithSubject() {

        CompletableFuture<String> allDone = new CompletableFuture<>();

        PublishSubject<Long> queue = PublishSubject.create();

        queue.observeOn(Schedulers.single())
        .flatMap(tx -> Observable.just(tx).delay(2, TimeUnit.SECONDS))
        .doOnSubscribe(dis -> System.out.println("Queue processing active"))
        .doOnComplete(() -> allDone.complete("DONE"))
        .subscribe(nextTs -> System.out.printf("[%s] : Processing tx : %d\n", Thread.currentThread().getName(), nextTs));

        Observable.interval(1, TimeUnit.SECONDS)
        .take(10)
        .doOnSubscribe(dis -> System.out.println("Job submitter start"))
        .doOnNext(tick -> {
            long ms = System.currentTimeMillis() / 1000;
            System.out.printf("[%s] : Submitting tx : %d\n", Thread.currentThread().getName(), ms);
            queue.onNext(ms);
        })
        .doOnComplete(() -> queue.onComplete())
        .blockingSubscribe();

        //wait until all done
        try {
            allDone.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        testWithQueue();
        testWithSubject();
    }
}
import java.util.Queue;
导入java.util.concurrent.CompletableFuture;
导入java.util.concurrent.ConcurrentLinkedQueue;
导入java.util.concurrent.ExecutionException;
导入java.util.concurrent.TimeUnit;
导入java.util.concurrent.AtomicBoolean;
导入io.reactivex.Observable;
导入io.reactivex.schedulers.schedulers;
导入io.reactivex.subjects.PublishSubject;
公共类DemoRxJava2{
publicstaticvoidtestwithqueue(){
CompletableFuture allDone=新的CompletableFuture();
AtomicBoolean submitDone=新的AtomicBoolean(Boolean.FALSE);
最终队列=新ConcurrentLinkedQueue();
可观测间隔(2,时间单位秒)
.takeWhile(勾选->!queue.isEmpty()| |!submitDone.get())
.flatMap(勾选->{
返回可观察。创建(子->{
而(!queue.isEmpty()){
sub.onNext(queue.poll());
}
sub.onComplete();
});
})
.subscribeOn(Schedulers.single())
.doOnSubscribe(dis->System.out.println(“队列处理活动”))
.doOnComplete(()->{
System.out.println(“队列处理完成”);
全部完成。完成(“完成”);
})
.subscribe(nextTs->System.out.printf(“[%s]:处理发送:%d\n”,Thread.currentThread().getName(),nextTs));
可观测间隔(1,时间单位。秒)
.take(10)
.doOnSubscribe(dis->System.out.println(“作业提交者启动”))
.doOnNext(勾选->{
长毫秒=System.currentTimeMillis()/1000;
System.out.printf(“[%s]:提交发送:%d\n”,Thread.currentThread().getName(),ms);
队列添加(ms);
})
.doOnComplete(()->submitDone.set(Boolean.TRUE))
.阻止订阅();
试一试{
全部完成。获取();
}捕获(中断异常|执行异常e){
e、 printStackTrace();
}
}
公共静态void testWithSubject(){
CompletableFuture allDone=新的CompletableFuture();
PublishSubject队列=PublishSubject.create();
queue.observeOn(Schedulers.single())
.flatMap(tx->Observable.just(tx).延迟(2,时间单位.秒))
.doOnSubscribe(dis->System.out.println(“队列处理活动”))
.doOnComplete(()->allDone.complete(“完成”))
.subscribe(nextTs->System.out.printf(“[%s]:处理发送:%d\n”,Thread.currentThread().getName(),nextTs));
可观测间隔(1,时间单位。秒)
.take(10)
.doOnSubscribe(dis->System.out.println(“作业提交者启动”))
.doOnNext(勾选->{
长毫秒=System.currentTimeMillis()/1000;
System.out.printf(“[%s]:提交发送:%d\n”,Thread.currentThread().getName(),ms);
queue.onNext(ms);
})
.doOnComplete(()->queue.onComplete())
.阻止订阅();
//等到一切都做完
试一试{
全部完成。获取();
}捕获(中断异常|执行异常e){
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
testWithQueue();
testWithSubject();
}
}

这只是一个演示,演示如何使用RxJava在一个单独的线程中处理对象队列,并根据您的需要调整它

这就是
java.util.concurrent.Executors
的用途。为什么要用RxJava来做呢?很好。我忘了加上。但是,我从未经历过。我只对RxJava2感兴趣。这些项目是什么?您想执行什么工作?项目可以并行处理。是否为每个项目生成结果?是否要等待处理每个或所有项目?项目的数量是有限的吗?我只需要一个io线程。每个工作都需要互相等待。没有并行处理。我已经更新了问题的更多细节。我在你的答案中没有看到任何RxJava2。看起来您并不是在寻找消息的异步处理。我以为您正在寻找一种方法,通过专用的独立线程处理队列中的对象(由其他线程提交)?是的。这就是我想要的;每个日志必须等待以完成队列中的当前日志。否则(如果是并行的),它们将分离输出。我希望RxJava2使用Flowable实现此功能,但不知道如何实现。请参阅我的答案,希望对您有所帮助