- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试线程驻留,并决定构建某种服务。看起来是这样的:
public class TestService {
private static final Logger logger = LoggerFactory.getLogger(TestService.class); // logback I think this logger causes some troubles
private final CountDownLatch stopLatch;
private final Object parkBlocker = new Object();
private volatile boolean stopped;
private final Thread[] workers;
public TestService(int parallelizm) {
stopLatch = new CountDownLatch(parallelizm);
workers = new Thread[parallelizm];
for (int i = 0; i < parallelizm; i++) {
workers[i] = new Thread(() -> {
try {
while (!stopped) {
logger.debug("Parking " + Thread.currentThread().getName());
LockSupport.park(parkBlocker);
logger.debug(Thread.currentThread().getName() + " unparked");
}
} finally {
stopLatch.countDown();
}
});
}
}
public void start() {
Arrays.stream(workers).forEach(t -> {
t.start();
logger.debug(t.getName() + " started");
});
}
public boolean stop(long timeout, TimeUnit unit) throws InterruptedException {
boolean stoppedSuccefully = false;
this.stopped = true;
unparkWorkers();
if (stopLatch.await(timeout, unit)) {
stoppedSuccefully = true;
}
return stoppedSuccefully;
}
private void unparkWorkers() {
Arrays.stream(workers).forEach(w -> {
LockSupport.unpark(w);
logger.debug("Un-park call is done on " + w.getName());
});
}
}
public static void main(String[] args) = {
while(true) {
TestService service = new TestService(2);
service.start();
if (!service.stop(10000, TimeUnit.MILLISECONDS))
throw new RuntimeException();
}
}
14:58:55.226 [main] DEBUG com.pack.age.TestService - Thread-648 started
14:58:55.227 [Thread-648] DEBUG com.pack.age.TestService - Parking Thread-648
14:58:55.227 [main] DEBUG com.pack.age.TestService - Thread-649 started
14:58:55.227 [main] DEBUG com.pack.age.TestService - Un-park call is done on Thread-648
14:58:55.227 [Thread-648] DEBUG com.pack.age.TestService - Thread-648 unparked
14:58:55.227 [main] DEBUG com.pack.age.TestService - Un-park call is done on Thread-649
14:58:55.227 [Thread-649] DEBUG com.pack.age.TestService - Parking Thread-649
Exception in thread "main" java.lang.RuntimeException
at com.pack.age.Test$.main(Test.scala:12)
at com.pack.age.Test.main(Test.scala)
"Thread-649" #659 prio=5 os_prio=0 tid=0x00007efe4433f000 nid=0x7691 waiting on condition [0x00007efe211c8000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000720739a68> (a java.lang.Object)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at com.pack.age.TestService.lambda$new$0(TestService.java:27)
at com.pack.age.TestService$$Lambda$1/1327763628.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
unpark
之前调用
park
,则保证
park
不会阻塞(这就是javadocs所说的)。
LockSupport::park
。您能提出任何建议吗?
最佳答案
这与记录器无关,尽管它的用法使问题浮出水面。就这么简单,您就有了比赛条件。在解释竞争条件之前,您需要首先了解LockSupport::unpark
文档中的一些知识:
Makes available the permit for the given thread, if it was not already available. If the thread was blocked on park then it will unblock. Otherwise, its next call to park is guaranteed not to block.
thread
,但尚未调用
park
,并且在这段时间内(线程的
start
和
park
之间),则其他一些线程在第一个线程上调用
unpark
:该线程根本不会停放。许可证将立即可用。可能是这张小图使它更加清晰:
(ThreadA) start ------------------ park --------- ....
(ThreadB) start ----- unpark -----
ThreadB
在
unpark(ThreadA)
调用
ThreadA
和
start
的时间段之间如何调用
park
。这样,当
ThreadA
到达
park
:
时,可以保证不会像文档中所述那样阻止。
This operation is not guaranteed to have any effect at all if the given thread has not been started.
Thread B calls unpark(ThreadA) --- Thread A starts --- Thread A calls park
ThreadA
调用
park
后,它将永远挂起,因为
ThreadB
再也不会在其上调用
unpark
了。注意,对
unpark
的调用是在
ThreadA
开始之前进行的(与前面的示例不同)。
LockSupport.unpark(w);
调用
unparkWorkers
之前先调用
t.start();
(来自
public void start(){...}
)。用简单的话来说-您的代码甚至在开始使用之前就在这两个
unpark
上调用
workers
,因此,当它们最终到达
park
时-他们被卡住了,没有人能够对它们进行
unpark
。您看到的是
logger
而不是
System::out
的事实,最有可能与您使用
println
时的表情有关–引擎盖下有一个
synchronized
方法。
LockSupport
恰好提供了证明这一点的语义。为此,我们需要(为简单起见:
SOProblem service = new SOProblem(1);
)
static class ParkBlocker {
private volatile int x;
public ParkBlocker(int x) {
this.x = x;
}
public int getX() {
return x;
}
}
unpark
的事实:
private void unparkWorkers() {
Arrays.stream(workers).forEach(w -> {
LockSupport.unpark(w);
logger.debug("Un-park call is done on " + w.getName());
});
/*
* add "1" to whatever there is already in pb.x, meaning
* we have done unparking _also_
*/
int y = pb.x;
y = y + 1;
pb.x = y;
}
public boolean stop(long timeout, TimeUnit unit) throws InterruptedException {
boolean stoppedSuccefully = false;
stopped = true;
unparkWorkers();
if (stopLatch.await(timeout, unit)) {
stoppedSuccefully = true;
// reset the flag
pb.x = 0;
}
return stoppedSuccefully;
}
.....
while (!stopped) {
logger.debug("Parking " + Thread.currentThread().getName());
// flag the fact that thread has started. add "2", meaning
// thread has started
int y = pb.x;
y = y + 2;
pb.x = y;
LockSupport.park(pb);
logger.debug(Thread.currentThread().getName() + " unparked");
}
public static void main(String[] args) throws InterruptedException {
while (true) {
SOProblem service = new SOProblem(1); // <-- notice a single worker, for simplicity
service.start();
if (!service.stop(10000, TimeUnit.MILLISECONDS)) {
service.debug();
throw new RuntimeException();
}
}
}
debug
方法在哪里:
public void debug() {
Arrays.stream(workers)
.forEach(x -> {
ParkBlocker pb = (ParkBlocker) LockSupport.getBlocker(x);
if (pb != null) {
System.out.println("x = " + pb.getX());
}
});
}
unpark
,然后再调用
park
,这是在将
x = 3
作为输出时发生的。
关于java - 服务中的 parking 线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50370522/
我将使用什么算法(是否使用蛮力)将尽可能多的汽车(假设所有汽车大小相同)放入 parking 场,以便至少有一个导出(来自容器)并且汽车不能被封锁。或者有人可以向我展示一个以编程方式解决此问题的示例。
我想使用 ggplot 绘制以下场景的网格图,我试图在下图中描绘该场景......我可以使用一些关于如何逻辑地思考该方法的指导。谢谢您的指导。 -- 下面示例图中的每个过道都有奇数边和偶数边 奇数一侧
嘿。 我正在设计一个网站(使用 spring、hibernate 和 postgres),供 parking 场所有者跟踪其 parking 场 parking 位的状态(占用、空置或保留),并且对于
我有一个连接到 Hazelcast 的应用程序。最近我发现对 hazelcast 的请求最终开始变得无响应,因此,我对 Hazelcast 进程进行了线程转储。在分析来自开发和生产环境的线程转储时,我
预计在汽车中使用 GPS。它有速度,但有时以 5 km/h 的低速行驶?:搜索 parking 位它显示速度为 0 - 并且汽车在移动! 如何检测汽车是否已停止? GPS 速度 = 0 并且: 加速度
我想编写一个 C 程序,其中有一个包含 10 个字符串的数组,其中每个字符串表示停在第 i 处的汽车的车牌号。随机选择一个点,如果空出,则生成一个随机车牌号并分配给该点,如果被占用,则腾出该点并删除车
看来,我找不到问题的答案,所以我在这里,首先在 Stackoverflow 上:) 即将提到的If语句树: buttonSzamol.addActionListener(new ActionListe
我们在 parking 场的入口和导出处安装了两个车牌读取器摄像头,在进行检测时会生成一个 CSV 文件,然后自动将其加载到数据库中,入口处还有一个自动操作的屏障由相机的“白名单”生成,然后从数据库内
编写一个程序,在给出以下信息时计算将车停在 parking 场的顾客的 parking 费: a.显示车辆类型的字符:C 代表轿车,B 代表巴士,T 代表卡车 b. 0 到 24 之间的整数,显示车辆
我是一名计算机科学专业的初学者,我们被要求完成一个项目,该项目将随机生成的汽车对象移动到城市 map 网格上随机生成的 parking 位。我为按钮、文本字段和文本区域开发了一个 GUI。一切都按要求
已解决。非常感谢所有提供意见的人。这里有很棒的社区。 我有一项任务,其中部分程序需要计算客户的 parking 费。 收费以小时和 1/2 小时为增量。 确定小时数和分钟数。第 1 分钟到第 30 分
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我注册了几个域名,每个域名都略有不同。 例如, 快车网快车网fastcar.co.uk网站fast-car.co.uk 等.. 我不希望因任何主要搜索引擎的重复内容或垃圾链接而受到惩罚。 我应该将它们
我网上找了很多解决导航方案的问题,均无法用于WordPress3.1之上,总会出现其他问题。而我所讲解的这种方法是最实用、简单的。如果你用的不是本款主题,你同样可以使用此方法。 首先,
我正在尝试线程驻留,并决定构建某种服务。看起来是这样的: public class TestService { private static final Logger logger = Log
我想创建一个应用程序来更快地支付 parking 费。 这个问题更多的是关于我的应用程序的逻辑,以及我需要使用什么工具来创建它。 此时,我每天使用一个 parking 位,并通过网页付费。 我是这样做
我无法同时运行超过 100 个线程。当我进行线程转储时,我注意到其中许多线程处于停放状态,即 parking to wait for (java.util.concurrent.locks.Abst
我正在开发车辆 parking 系统java应用程序。应用程序应该跟踪汽车何时进入 parking 场、何时离开 parking 场、 parking 场的状态,是否已满。该应用程序还应检查 park
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我有一个卡车停车应用程序,在该应用程序中,卡车运输公司可以预订特定日期的某个位置的停车位数量。 我需要帮助来修改查询以查找特定时期的停车位。 我在此过程中有3张桌子: 位置 +------------
我是一名优秀的程序员,十分优秀!