- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我相信无论使用什么语言都可以考虑我的问题,但是为了有一些“ anchor ”,我将使用 Java 语言来描述它。
让我们考虑以下场景:我有一个扩展 Thread 的类 PickyHost 及其实例 pickyHostInst 正在运行。该类可能如下所示:
class PickyHost extends Thread {
private ArrayList guests;
public void enter(Guest g) {
// deal with g
}
private void pickGuests() {
// ...
}
công khai void run() {
// listen indefinitely
}
}
此外,在后台,我有许多 Guest 实例正在运行(它们还扩展了 Chủ đề 类),并且偶尔会有一些 guest 实例> 想要调用 pickyHostInst TRÊN enter 方法,参数 g 是其本身。现在,我希望 PickyHost 在以下意义上是挑剔的:
有人调用enter方法后,它会将gĐịa điểmguests列表的末尾并强制g等待通知。另外(我认为这就是问题的症结所在)它会自行 hibernate 5 秒,并以某种方式允许(在这 5 秒内)其他客人调用 enter 方法(如果发生这种情况,那么它会忘记大约需要 sleep 多长时间,然后将闹钟重置为正好再次 sleep 5 秒) - 我将其称为敏感 sleep .
如您所见,如果有很多客人到达,pickyHostInst sleep 的总时间可能会很大 - 例如:A 到达,然后 4 秒后 B 到达,然后再过 4 秒 C 到达,很快。然而,假设已经创建了一条客人链A、B、...、G,并且从G到达的那一刻起直到5秒后,没有人到达。然后我希望 pickyHostInst Gọi pickGuests 方法,该方法使用某种算法确定 {A, B, ..., G 的 子集 S } 的客人通知他们可以停止等待并继续做他们通常做的事情,并且从 客人 列表中删除 S 的元素。方法pickGuests可能需要一些时间才能完成,同时某些客人H可能已经到达并调用enter - 那么enter应该正常进行,但是< strong>pickGuests 应该忽略 H 并在最后一次调用结束时处理 {A, B, ..., G} - 而不是 {A, B, ..., G, H}。完成 pickGuests 后,pickyHostInst 应该(这里我有 2 个想法 - 实现其中任何一个都会让我开心:))要么
最后,经过长时间的介绍,我的问题是——我需要哪些工具来完成这样的任务?不幸的是,我在各种锁和多线程/锁定机制的丰富性中有点迷失,无法辨别哪一个适合我的问题(或者哪些以某种方式组合)。
我将非常感谢一些代码草图,它们将使我走上正轨。
1 Câu trả lời
Bạn có thể sử dụngjava.util.Timer
对象,该对象可以在enter
方法中重置。计时器任务将在自己的线程中运行,如果没有事先取消,它会为您进行挑选。
Xin lưu ý,enter
方法将在众多 Guest
线程之一上运行。这意味着它可能应该同步。最简单的方法是在 Java 中的方法声明中添加 đồng bộ
关键字:public synchronized void Enter(Guest g)
。这将确保一次只有一名客人可以进入。您可以将计时器取消/重新启动代码放在这里。
java.util.Timer通过抽象java.util.TimerTask
类来工作。这是一种 Runnable
类型,它也有一个取消任务的方法。我的建议是安排一个任务,每当客人进入时,都会在 5000 毫秒的时间间隔后挑选客人。如果前一个 guest 的任务正在运行,请先取消它。
enter
方法应该获取 guest 的锁(使用同步块(synchronized block))并让 guest 等待。挑选应该对您选择的客人调用 notify()
方法。这将使他们能够继续执行。
当您从队列中删除选定的 guest 时,请注意 Java 集合默认情况下不是线程安全的。您必须使用外部锁来确保在添加和删除客人时没有其他人修改您的列表。 Collections.synchronizedList(List)
方法提供了一种简便的方法来执行此操作。
以下是讨论我提到的主题的链接列表:
关于java - 挑剔的主机(锁?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20775154/
1. Khóa công bằng và khóa không công bằng 1.1 Tổng quan về khóa công bằng và khóa không công bằng Khóa công bằng: chỉ nhiều luồng lấy khóa theo thứ tự chúng áp dụng cho khóa. Khóa không công bằng: đề cập đến thứ tự mà nhiều luồng có được khóa, không theo thứ tự mà chúng áp dụng cho khóa. Có thể luồng áp dụng sau sẽ nhận được khóa trước hơn luồng áp dụng trước.
Đọc nội dung 1. Giới thiệu 2. Phân loại 3. Khóa toàn cục 4. Khóa bảng 5. Khóa bảng 6. Khóa siêu dữ liệu
Vì vậy, trong chương trình tôi đang viết, tôi có ba hàm, hãy gọi chúng là A, B và C để đơn giản. Mỗi chức năng cần truy cập vào tài nguyên X để hoạt động. Hạn chế là A và B không được phép chạy cùng lúc và phải được đồng bộ hóa đúng cách. Tuy nhiên, C có thể chạy đồng thời với A hoặc B.
Tôi đã nghe những từ này liên quan đến lập trình đồng thời, nhưng sự khác biệt giữa khóa, mutex và semaphore là gì? Câu trả lời hay nhất Khóa chỉ cho phép một luồng vào phần đã khóa và khóa này không được chia sẻ với bất kỳ tiến trình nào khác. Mutex giống như khóa, nhưng nó có thể áp dụng trên toàn hệ thống (được chia sẻ bởi nhiều quy trình).
Câu hỏi này đã có câu trả lời: Cách hiệu quả để triển khai mô hình singleton trong Java là gì? [đã đóng] (29 câu trả lời) Đã đóng
Câu hỏi này đã có câu trả lời: Cách hiệu quả để triển khai mô hình singleton trong Java là gì? [đã đóng] (29 câu trả lời) Đã đóng
Tôi có một vài câu hỏi về chủ đề trong tiêu đề. Đầu tiên, giả sử chúng ta sử dụng JDBC và có 2 giao dịch T1 và T2. Trong T1, chúng ta thực hiện câu lệnh select trên một hàng cụ thể. Sau đó chúng tôi thực hiện cập nhật trên hàng đó. Trong giao dịch T2, chúng tôi
Tôi muốn hàm của tôi chỉ chạy một lần. Điều này có nghĩa là nếu nhiều luồng gọi hàm này cùng một lúc, hàm sẽ chặn tất cả các luồng và chỉ cho phép luồng đó chạy. Câu trả lời hay nhất Có vẻ như bạn muốn quy trình được lưu trữ phải đồng bộ. Tại sao không đưa tính năng đồng bộ hóa vào ngay trong ứng dụng? pthread_tắt tiếng
if (runInDemoMode) { lock (this) { //Khởi tạo các bảng dCreator.create
Tôi tin rằng vấn đề của tôi có thể được trình bày bằng bất kỳ ngôn ngữ nào, nhưng để có một số "điểm neo", tôi sẽ mô tả nó bằng Java. Hãy xem xét tình huống sau: Tôi có một lớp PickyHost mở rộng Thread và thể hiện p của nó
Tôi biết rằng async không song song, nhưng bây giờ tôi đang phải đối mặt với một tình huống rất thú vị. hàm async magic(){ /* một số xử lý ở đây */ await async () =
Chúng tôi đang xây dựng một ứng dụng web bằng Scala, Play framework và MongoDB (với ReactiveMongo là trình điều khiển). Kiến trúc ứng dụng không bị chặn từ đầu đến cuối. Trong một số phần của mã, chúng ta cần truy cập
Tôi cần một khóa đơn giản với thời gian chờ JavaME (backport của concurrent.lock yêu cầu Java 1.3 đầy đủ). Nếu ai đó đã công bố mã khóa thử nghiệm cho JavaME, tôi muốn sử dụng mã đó. Khóa đã bị khóa
Theo boost: Để truy cập đối tượng, weak_ptr có thể được chuyển đổi thành shared_ptr bằng cách sử dụng bản sao shared_ptr
Có một câu hỏi về sự khác biệt giữa các phần Mutex và Critical, nhưng nó cũng không xử lý được Locks. Vì vậy, tôi muốn biết liệu các phần quan trọng có thể được sử dụng để đồng bộ hóa luồng giữa các quy trình hay không. Ý nghĩa của trạng thái có tín hiệu và không có tín hiệu là gì? Câu trả lời tốt nhất nằm trong Win
Ứng dụng phổ biến nhất của khóa là kiểm soát hàng tồn kho trong các tình huống có nhiều hoạt động đồng thời. Lần này chúng tôi chỉ giới thiệu sơ lược về khóa độc lập. Hãy xem trực tiếp mã: Mỗi lần có yêu cầu, hàng tồn kho sẽ giảm đi 1. Nếu hàng tồn kho là 1000, sau 1000 yêu cầu, hàng tồn kho sẽ trở thành 0.
Luồng và tiến trình 1. Luồng chia sẻ không gian địa chỉ của tiến trình đã tạo ra chúng và tiến trình có không gian địa chỉ riêng của nó 2. Luồng có thể truy cập tất cả dữ liệu của tiến trình và các luồng có thể truy cập lẫn nhau 3. Dữ liệu giữa các luồng là độc lập 4. Tiến trình con sao chép dữ liệu của luồng 5. Tiến trình con bắt đầu
**Tóm tắt: ** Những người cẩn thận hẳn đã nhận thấy rằng một số URL bắt đầu bằng https và một số bắt đầu bằng http. Sẽ có một ổ khóa nhỏ ở phía trước trang web bắt đầu bằng https. Tại sao lại thế? Bài viết này được chia sẻ từ Huawei Cloud Community "Bạn không biết rằng chứng chỉ SSL đã trở thành một điều cần thiết sao? Hãy đến và tìm hiểu
Tôi đang cố gắng triển khai một mutex (khóa) rất đơn giản trong C và tôi hơi bối rối. Tôi hiểu rằng mutex tương tự như semaphore nhị phân, ngoại trừ mutex còn áp dụng ràng buộc rằng luồng giải phóng khóa phải là luồng đã có được khóa gần đây nhất. Tôi không biết làm thế nào để theo dõi quyền sở hữu? Đây là những gì tôi đã làm cho đến nay
Sau khi đọc nhiều bài đăng và câu trả lời liên quan đến chủ đề trên, tôi vẫn muốn biết cơ sở dữ liệu SQL Server hoạt động như thế nào trong ví dụ sau: Giả sử chúng ta có một bảng có tên là t3: create table t3 (a int ,
Tôi là một lập trình viên xuất sắc, rất giỏi!