如何从Swing或控制台访问BlockingQueue?

图菲尔

无论是来自GUI还是控制台,该如何与之交互Consumer我应该只是公开consume地公开,还是私有包?看来它正在步入雷区。

消费者:

package net.bounceme.dur.client;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.concurrent.BlockingQueue;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.bounceme.dur.data.State;
import net.bounceme.dur.data.Title;

public class Consumer implements Runnable {

    private final BlockingQueue<Title> queue;
    private ObjectOutputStream objectOutputStream = null;

    public Consumer(BlockingQueue<Title> queue, ObjectOutputStream objectOutputStream) {
        this.queue = queue;
        this.objectOutputStream = objectOutputStream;
    }

    private void consume() throws InterruptedException, IOException {
        Title title = queue.take();
        title.setState(State.x);
        objectOutputStream.writeObject(title);
    }

    @Override
    public void run() {
        try {
            consume();
        } catch (InterruptedException | IOException ex) {
            Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
            //exit?
        }
    }
}

服务:

package net.bounceme.dur.client;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Properties;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import net.bounceme.dur.data.Title;

public class ProducerConsumerService implements Executor {

    private static final Logger log = Logger.getLogger(ProducerConsumerService.class.getName());
    private final BlockingQueue<Title> queue = new ArrayBlockingQueue<>(1);
    private Producer producer = null;
    private Consumer consumer = null;

    public void ProducerConsumerService() {
    }

    public void produce() {
    }

    public void consume() {
    }

    public void startService() throws IOException {
        Properties props = PropertiesReader.getProps();
        int portNumber = Integer.parseInt(props.getProperty("port"));
        String host = props.getProperty("server");
        Socket socket = new Socket(host, portNumber);
        ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
        producer = new Producer(queue, objectInputStream);
        consumer = new Consumer(queue, objectOutputStream);
        new Thread((Runnable) producer).start();
        new Thread((Runnable) consumer).start();
        log.info("started...");
    }

    @Override
    public void execute(Runnable command) {
        new Thread(command).start();
    }
}

或者,是否可以在服务中添加方法来访问BlockingQueue但是,这样做似乎消除了对Consumer类本身的需要

外部类(控制台或Swing接口)对这三个类的正确用法是什么?

参考:

http://www.journaldev.com/1034/java-blockingqueue-example-implementing-producer-consumer-problem

图菲尔

我关注以下解决方案:

package net.bounceme.dur.client;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Properties;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import net.bounceme.dur.data.Title;

public class ProducerConsumerService implements Executor {

    private static final Logger log = Logger.getLogger(ProducerConsumerService.class.getName());
    private final BlockingQueue<Title> queue = new ArrayBlockingQueue<>(1);
    private Producer producer = null;
    private Consumer consumer = null;
    private Title title = null;

    public void ProducerConsumerService() {
    }

    public Title produce() throws InterruptedException, IOException, ClassNotFoundException {
        producer.produce();
        title = queue.take();
        consumer.consume(title);
        return title;
    }

    public void startService() throws IOException {
        Properties props = PropertiesReader.getProps();
        int portNumber = Integer.parseInt(props.getProperty("port"));
        String host = props.getProperty("server");
        Socket socket = new Socket(host, portNumber);
        ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
        producer = new Producer(queue, objectInputStream);
        consumer = new Consumer(queue, objectOutputStream);
        new Thread((Runnable) producer).start();
        new Thread((Runnable) consumer).start();
        log.info("started...");
    }

    @Override
    public void execute(Runnable command) {
        new Thread(command).start();
    }
}

它通过暴露过多的服务ProduceerConsumer通过produce()服务中方法来破坏封装

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从控制台访问$ templateCache

来自分类Dev

如何访问Druid控制台

来自分类Dev

如何访问GCE VM实例的控制台?

来自分类Dev

如何从浏览器控制台访问RequireJS模块?

来自分类Dev

如何从Dartium DevTool控制台访问Dart函数/变量?

来自分类Dev

如何在MacBook上访问控制台TTY?

来自分类Dev

如何通过控制台获取 Google Bucket 的访问日志?

来自分类Dev

远程访问OpenShift Web控制台

来自分类Dev

无法访问管理控制台

来自分类Dev

从控制台访问IIS缓存

来自分类Dev

在VM中访问设备控制台

来自分类Dev

通过 chrome 控制台访问 DOM

来自分类Dev

如何将控制台应用程序转换为SWING框架?

来自分类Dev

如何从浏览器控制台访问组件控制器?

来自分类Dev

如何访问firefox Web控制台命令历史记录?

来自分类Dev

如何在没有控制台访问权限的主机上处理yii2迁移?

来自分类Dev

如何从Google Apps帐户访问Google Play开发者控制台

来自分类Dev

使用乘客和Rails应用启动Nginx时如何访问Rails应用的控制台(stdout)?

来自分类Dev

Symfony2-如何在自定义控制台命令中访问服务?

来自分类Dev

如何让PyCharm中的Python控制台访问脚本的可变空间?

来自分类Dev

如果表名中带有_,如何从Rails控制台访问表

来自分类Dev

如何从浏览器控制台访问和测试AngularJS过滤器?

来自分类Dev

如何使用RBAC提供程序(localhost)访问WildFly管理控制台?

来自分类Dev

如何使用访问密钥,秘密密钥和会话令牌登录到AWS控制台?

来自分类Dev

AWS ElasticSearch控制台:如何访问我的ES域中的“索引”选项卡

来自分类Dev

通过控制台应用程序设置作业时如何访问hangfire仪表板

来自分类Dev

如何访问我的Minecraft服务器控制台?

来自分类Dev

除了通过密钥验证的SSH之外,如何阻止所有控制台访问?

来自分类Dev

如何从开发者控制台访问我的角度资源?

Related 相关文章

  1. 1

    如何从控制台访问$ templateCache

  2. 2

    如何访问Druid控制台

  3. 3

    如何访问GCE VM实例的控制台?

  4. 4

    如何从浏览器控制台访问RequireJS模块?

  5. 5

    如何从Dartium DevTool控制台访问Dart函数/变量?

  6. 6

    如何在MacBook上访问控制台TTY?

  7. 7

    如何通过控制台获取 Google Bucket 的访问日志?

  8. 8

    远程访问OpenShift Web控制台

  9. 9

    无法访问管理控制台

  10. 10

    从控制台访问IIS缓存

  11. 11

    在VM中访问设备控制台

  12. 12

    通过 chrome 控制台访问 DOM

  13. 13

    如何将控制台应用程序转换为SWING框架?

  14. 14

    如何从浏览器控制台访问组件控制器?

  15. 15

    如何访问firefox Web控制台命令历史记录?

  16. 16

    如何在没有控制台访问权限的主机上处理yii2迁移?

  17. 17

    如何从Google Apps帐户访问Google Play开发者控制台

  18. 18

    使用乘客和Rails应用启动Nginx时如何访问Rails应用的控制台(stdout)?

  19. 19

    Symfony2-如何在自定义控制台命令中访问服务?

  20. 20

    如何让PyCharm中的Python控制台访问脚本的可变空间?

  21. 21

    如果表名中带有_,如何从Rails控制台访问表

  22. 22

    如何从浏览器控制台访问和测试AngularJS过滤器?

  23. 23

    如何使用RBAC提供程序(localhost)访问WildFly管理控制台?

  24. 24

    如何使用访问密钥,秘密密钥和会话令牌登录到AWS控制台?

  25. 25

    AWS ElasticSearch控制台:如何访问我的ES域中的“索引”选项卡

  26. 26

    通过控制台应用程序设置作业时如何访问hangfire仪表板

  27. 27

    如何访问我的Minecraft服务器控制台?

  28. 28

    除了通过密钥验证的SSH之外,如何阻止所有控制台访问?

  29. 29

    如何从开发者控制台访问我的角度资源?

热门标签

归档