- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在做一个项目,我需要使用 TwitterAPI 检索 Twitter 消息,处理它们并将它们存储在数据库中。我正在使用 Producer/Consumer BlockingQueue,其中元素的作用如下:
这是主类:
// Creating shared object
BlockingQueue sharedQueue = new ArrayBlockingQueue(1);
// Creating Producer and Consumer Thread
Thread prodThread = new Thread(new TwitterStreamProducer(sharedQueue));
Thread consThread = new Thread(new TwitterStreamConsumer(sharedQueue));
// Starting producer and Consumer thread
prodThread.start();
consThread.start();
生产者处理 TwitterAPI 响应并将对象添加到队列中。
@Ghi đè
công khai void run() {
while (true) {
thử {
message = extractData(); // extract data from TwitterAPI response and return TwitterMessage object
sharedQueue.put(message);
System.out.println("Produced: " + message.getTwitterMessage());
} catch (Exception ex) {
Logger.getLogger(TwitterStreamProducer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
消费者做如下:
private final BlockingQueue sharedQueue;
private TwitterProcessor twitterProcessor;
private TwitterMessage twitterMessage;
public TwitterStreamConsumer(BlockingQueue sharedQueue) {
this.sharedQueue = sharedQueue;
twitterProcessor = new TwitterProcessor();
}
@Ghi đè
công khai void run() {
while (true) {
thử {
twitterMessage = this.twitterProcessor.process(sharedQueue.take());
if (twitterMessage.getTwitterMessage().length() > 1) {
System.out.printf("Consumed: %s\n", twitterMessage.getTwitterMessage());
}
} catch (InterruptedException ex) {
Logger.getLogger(TwitterStreamConsumer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
我希望看到的是以下内容:
Produced: …twittermessage1…
Consumed: …twittermessage1…
Produced: …twittermessage2…
Consumed: …twittermessage2…
Produced: …twittermessage3…
Consumed: …twittermessage3…
...
但是,我得到的结果如下:
Produced: …twittermessage1…
Produced: …twittermessage2… <= problem
Consumed: …twittermessage1…
Produced: …twittermessage3…
Consumed: …twittermessage3…
Consumed: …twittermessage3… <= problem
Produced: …twittermessage4… <= problem
Produced: …twittermessage5…
Consumed: …twittermessage5…
如您所见,有时生产者和消费者之间存在重叠,生产者生产的消息过多而未被消费。有时一条消息会被消费两次(有时甚至超过两次)
编辑1这是控制台上打印的内容:
Produced: @1StevenGeorgiou thanks for the follow #ff
Processed: follow
Produced: @nmagliozzi6 @_PatrickKealy_ but of course!!!!!
Produced: @taylorgaglia Thanks Tayl miss you tooo
Processed: tayl miss
Produced: Hate this who to follow tab in #twitter it's shows the most pathetic people you know. Accidently added one I had to act fast to unfollow
Processed: hate follow tabshow pathet peopl accid ad act fast unfollow
编辑2正如 John Vint 建议打印出“System.identityHashCode(sharedQueue.take())”,我得到以下信息:
Produced: …
Consumed: 1206857787
Produced: …
Consumed: 1206857787
…
有人可以帮我解决这个问题吗?
Cảm ơn!
1 Câu trả lời
代码运行正常:线程的执行顺序未定义。因此,生产者很有可能在处理前一条消息之前生成多条消息。这甚至是一个理想的特性,因为它允许有多个线程处理获取(生产者),这将花费一些时间作为阻塞,并且只有更少甚至单个消费者实际处理这些中间结果。
但是在您的代码中,您违反了生产者/消费者的基本规则,即他们之间的关系需要有所不同。由于您目前每条消息都有一个生产者/消费者对,因此使用的模式只会减慢速度。您应该增加 getter 的数量(并接受异步处理),或者 - 如果您不想要异步处理 - 完全删除该模式并让“消费者”自行获取消息。
编辑:如果您使用像 LinkedBlockingQueue 这样的并发队列你的问题应该已经解决了。
也看看 ExecutorService类,它大大简化了 Runnable 的线程处理。
关于Java BlockingQueue 生产/消费不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22013336/
Câu hỏi này đã có câu trả lời: Làm thế nào để so sánh chuỗi không phân biệt chữ hoa chữ thường? (23 câu trả lời) Đã đóng 3 năm trước. Người dùng nhập "bóng đá" vào trường nhập liệu của tôi, sau đó thực hiện bước 6.
À, tôi không quen sử dụng chuỗi trong JavaScript. character_id= + id + correct= + correctOrIncorrect Đây là những gì tôi cần biến thành một chuỗi. Nếu bạn không thể đoán được nhân vật
$(function() { var base_price = 0; CalculatePrice(); $(".math1").on('thay đổi', function(e) { Tính toán
Tôi không tìm thấy bài viết nào trả lời câu hỏi: Có an toàn/đúng khi triển khai Spinnaker tới cùng cụm Kubernetes mà Spinnaker sẽ quản lý không? Tôi chủ yếu đang đề cập đến việc sản xuất, triển khai HA. Tôi nghĩ câu trả lời tốt nhất là Spinnaker và Kuberne
Tôi đang xây dựng Qt5 (Qt 5.15.0) từ nguồn (bản phân phối chính thức, không phải từ kho lưu trữ) trên Windows bằng MSVC. Tôi đang thiết lập môi trường. biến, phụ thuộc, v.v., sau đó chạy configure với 16 triệu tùy chọn và cuối cùng
Tôi cần in ra một mảng chứa các từ lặp lại. Tôi đã có mảng hoạt động nhưng không biết cách đếm số từ một cách chính xác. Tôi đã biết rằng khi bộ đếm chỉ số (i) của tôi là 49 và khi (i) muốn đếm đến 50 thì tôi sẽ gặp lỗi, nhưng tôi không biết
Tôi đang làm theo hướng dẫn cho phép màn hình bản đồ Google tắt chức năng cuộn dựa trên kích thước màn hình. Phần duy nhất tôi đang gặp khó khăn là viết mã thay đổi động các giá trị Đúng/Sai khi tôi thay đổi kích thước màn hình theo cách thủ công. Đây là trang web tôi đã làm theo hướng dẫn nhưng
Tôi có một lớp "FileButton". Mục đích của nó là liên kết một tệp với JButton, nơi FileButton kế thừa. Các lớp con kế thừa từ lớp này để thực hiện những việc hữu ích với tệp được liên kết tới nút. Thẻ JingleButt
Mảng của bạn tôi chỉ trả về một số thay vì tất cả các số. ($myfriends = 3) phải là... ($myfriends = 3 5 7 8 9 12). Nếu tôi đặt nó trong một vòng lặp while... toàn bộ
Câu hỏi này đã có câu trả lời tại đây: Có cách giải quyết nào để làm cho các lớp CSS có tên bắt đầu bằng số trở nên hợp lệ không?
Tôi đang tạo một hàm JavaScript tự động thay đổi kích thước của một div thành cùng chiều rộng/chiều cao với cửa sổ khi cửa sổ thay đổi kích thước. Chức năng này khá cơ bản, nhưng tôi nhận thấy có độ trễ đáng kể khi "vẽ" khi thay đổi kích thước cửa sổ. Trong JS fi
Bạn có thể xem hình ảnh cơ bản về vấn đề này tại http://sevenx.de/demo/bootstrap-carousel/inc.carousel/tabbed-slider.html. - Nếu anh muốn xem thì xem.
Tôi hiểu rằng nếu tôi muốn trả về một chuỗi ký tự hoặc một mảng từ một hàm, tôi phải khai báo nó là tĩnh để nội dung không "chết" khi hàm được gọi trả về. Nhưng câu hỏi của tôi là, điều gì xảy ra khi tôi phân bổ bộ nhớ bằng malloc bên trong một hàm? Dưới
Trường dữ liệu nào là phù hợp nhất (với lượng dữ liệu cần đọc ít nhất) để lưu trữ các giá trị true/false/1/0 trong cơ sở dữ liệu mySQL? Tôi đã từng sử dụng tinyint, một hàm chỉ dài một ký tự nhưng tôi không chắc liệu đó có phải là giải pháp tốt nhất không? Cảm ơn bạn! Câu trả lời hay nhất
Tôi muốn đọc và xử lý (ví dụ: in) từng mục trong hàng đầu tiên của tệp CSV. Tôi cho rằng sử dụng ký tự xuống dòng theo kiểu Unix \n, không có mục nào dài hơn 255 ký tự và (hiện tại) có một dấu xuống dòng trước EOF. Điều này có nghĩa là fgets() theo sau là strto
Vì vậy, chúng ta đều biết các quy tắc so sánh có dấu/không dấu của C/C++ là -1 > 2u == true và tôi có một tình huống mà tôi muốn triển khai phép so sánh "đúng" một cách hiệu quả. Câu hỏi của tôi là cách tiếp cận nào hiệu quả hơn khi xem xét càng nhiều kiến trúc mà mọi người quen thuộc càng tốt. Trình diễn
**Tóm tắt:** Tiêu đề của bài viết có vẻ mâu thuẫn. Bài viết này được chia sẻ từ Cộng đồng đám mây Huawei "Xử lý ngoại lệ Java: Cách viết chương trình "đúng" bị trình biên dịch coi là không đúng về mặt cú pháp", tác giả: Jerry Wang. Tiêu đề của bài viết có vẻ mâu thuẫn, nhưng tôi
Tôi có một khung dữ liệu trông như thế này: dataDemo % mutate_each(funs(ifelse(. == '.', REF, as.character(.))), -POS) # POS REF
Có ai có thể giúp tôi định dạng lại/định dạng đúng một tệp văn bản phân cách bằng VBScript không? Tôi có một tệp văn bản^được phân cách như sau: AGREE^NAME^ADD1^ADD2^ADD3^ADD4^PCODE^BAL^A
Hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi mong đợi câu trả lời được hỗ trợ bằng sự kiện, trích dẫn hoặc chuyên môn, nhưng câu hỏi này có thể gây ra tranh luận, tranh cãi, thăm dò ý kiến hoặc thảo luận mở rộng. Nếu bạn cảm thấy câu hỏi này có thể được cải thiện và có thể mở lại, hãy truy cập
Tôi là một lập trình viên xuất sắc, rất giỏi!