- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在这里想做的是由偶数消费者打印偶数,由奇数消费者打印奇数。
有一个 evenodd
方法,它基本上消耗任何数字并打印(无论是偶数还是奇数)。我有 2 个偶数消费者线程、2 个奇数消费者线程、2 个偶数消费者线程和 3 个生产者线程。
我对信号量概念很陌生,我尝试使用它。当我删除 evenodd
方法和相关线程时,我得到了正确的输出,即偶数线程的偶数和奇数线程的奇数。但是当我再次放置 evenodd
方法和 evenodd
线程时,我遇到了死锁。
如果有人能指导我,我哪里出了问题以及如何解决它,那将非常有帮助。请详细说明如何实现 evenodd
方法,以便它能够正常工作。
package lab61;
import java.util.LinkedList;
import java.util.Random;
import java.util.concurrent.Semaphore;
public class Process {
Semaphore empty;
Semaphore full;
Semaphore even;
Semaphore odd;
Semaphore mutex;
//Semaphore evenodd;
boolean evenb;
boolean oddb,eo;
LinkedList<Integer> list;
Random random;
public Process(int capacity){
list=new LinkedList<Integer>();
empty=new Semaphore(capacity);
full=new Semaphore(0,true);
mutex=new Semaphore(1,true);
even=new Semaphore(0,true);
evenb=false;
oddb=false;
eo=false;
odd=new Semaphore(0,true);
//evenodd = new Semaphore(0,true);
random=new Random();
}
public void Producer() throws InterruptedException{
while(true){
int a=random.nextInt(100);
empty.acquire();
mutex.acquire();
list.add(a);
System.out.println("Producing "+a);
System.out.println(list);
if((list.get(0)%2)==0){
if(!evenb){
even.release();
evenb = true;
}
}else if((list.get(0)%2)==1){
if(!oddb){
odd.release();
oddb = true;
}
}
/*if(((list.get(0)%2)==0)||((list.get(0)%2)==1)){
if(!eo){
evenodd.release();
eo = true;
}
}*/
mutex.release();
full.release();
}
}
public void consumereven() throws InterruptedException{
while(true){
//Thread.sleep(2000);
even.acquire();
Thread.sleep(2000);
full.acquire();
mutex.acquire();
int value = list.removeFirst();
System.out.println("I am the even consumer "+ value);
evenb = false;
System.out.println(list);
mutex.release();
empty.release();
}
}
public void consumerodd() throws InterruptedException{
while(true){
//Thread.sleep(2000);
odd.acquire();
Thread.sleep(2000);
full.acquire();
//odd.acquire();
mutex.acquire();
int value = list.removeFirst();
System.out.println("I am the odd consumer "+ value);
System.out.println(list);
oddb = false;
mutex.release();
empty.release();
}
}
public void evenodd() throws InterruptedException {
while(true){
full.acquire();
mutex.acquire();
int value = list.removeFirst();
System.out.println("i am the evenodd consumer " + value );
if((list.get(0)%2)==0){
if(oddb=true){
odd.acquire();
oddb=false;
}
if(evenb==false){
even.release();
evenb = true;
}
}
else if((list.get(0)%2)==1){
if(evenb=true){
even.acquire();
evenb=false;
}
if(oddb==false){
odd.release();
oddb = true;
}
}
System.out.println(list);
mutex.release();
empty.release();
}
}
}
package lab61;
import lab6.producer;
public class App {
public static void main(String[] args) throws InterruptedException{
Process p=new Process(10);
Thread producer1=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
p.Producer();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread producer2=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
p.Producer();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread producer3=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
p.Producer();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread consumereven1=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
p.consumereven();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread consumereven2=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
p.consumereven();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread consumerodd1=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
p.consumerodd();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread consumerodd2=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
p.consumerodd();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread evenodd1=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
p.evenodd();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread evenodd2=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
p.evenodd();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
producer1.start();
producer2.start();
producer3.start();
consumereven1.start();
consumereven2.start();
consumerodd1.start();
consumerodd2.start();
evenodd1.start();
evenodd2.start();
producer1.join();
producer2.join();
producer3.join();
consumereven1.join();
consumereven2.join();
consumerodd1.join();
consumerodd2.join();
evenodd1.join();
evenodd2.join();
}
}
最佳答案
该代码可能会导致死锁,因为 consumereven()
和 consumerodd()
方法获取 even
或 odd
> 信号量位于 full
和 mutex
信号量之前,而 evenodd()
方法获取 full
和 在
信号量。这会导致这样一种情况:运行 偶数
或奇数
信号量之前互斥consumereven()
的线程具有 even
信号量,但在等待 full
信号量时被阻塞,而运行evenodd()的线程拥有full
信号量,但在even
信号量上被阻塞,因此两个线程陷入死锁。
为了帮助防止死锁,当您使用多个锁时,最好始终以相同的顺序获取它们,无论它们在哪里使用,并以与获取相反的顺序释放它们。
关于java - 偶数、奇数和偶数消费者-生产者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33151192/
我有一个包含多个数字的数组: int[] tab = {1,2,3,4}; 我必须创建两个方法,第一个是 sum() 方法,第二个是 numberOdd()。 这一步就OK了! int length
我一直在研究这个简单的待办事项列表,现在正处于调试阶段。当我实现不同的更改时,我观察到以下情况 保留列表中的所有项目:我添加 1 项,没问题。我添加了 2 个项目,但没有任何效果 - 无法标记完整/不
我想仅在未引用的术语中将 | 替换为 OR,例如: "this | that" | "the | other" -> "this | that" OR "the | other" 是的,我可以分割空格
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我在一些练习中得到了这个示例代码,它展示了如何查找整数是奇数还是偶数。 int x = 4; if ( (x & 1) == 0 ) { System.out.prin
我无法制作简单的 JavaScript 来获取文本框中的数字,并在单击按钮时返回结果。 function check() { var v=document.getElem
我是一名初学者,我正在尝试创建一个程序,该程序将生成仅由偶数组成的数字,并四舍五入到最接近的偶数。 例子: 135 --> 200 2700 --> 2800 我有一个代码,但每当我尝试打印它时,数字
我正在尝试编写一个程序,它将接受两个数字并根据它们的值返回两个都是奇数,两个都是偶数,或者 A 是奇数而 B 是偶数,等等。 我设法让程序检查一个变量,但如果我添加第二个变量,我会得到一个我不期望的输
这是一个带有数据和下一个属性的标准链表。 这就是我正在尝试的: class Node { constructor(data, next) { this.data = data;
我有一个正则表达式问题,我不知道该怎么做。它必须匹配开头包含任意数量的 a 的所有字符串,然后如果 a 的数量是偶数则匹配单个 0,如果 a 的数量是奇数则匹配单个 1。 如何跟踪偶数/奇数? 示例
我试图在数组中执行一个循环,对内容进行排序并创建每个具有 2 个值的 div。 尝试了很多东西,但我不知道我需要做什么。 这就是我需要做的:在数组中循环并创建 div。每个 div 应该有 2 个数组
您好,想知道是否有更简单的方法来显示奇数/偶数。我知道我可以做一个 for 循环并加载一个列表。然后我可以写另一个for循环遍历列表并检查值是否为奇数/偶数: for(i=0; i i % 2 ==
我正在尝试改变边距以使图像上下呈之字形。我发现this article很接近,但将一项更改应用于所有 .brochureImg 类。我做错了什么? HTML GP &
我编写这个方法来重新排列两个堆栈的元素,使堆栈 s1 只包含偶数整数,堆栈 s2 只包含奇数整数。并且 s1 或 s2 中不应存储任何零。 public static void rerange(sta
我需要帮助才能将未知整数分成给定数量的偶数部分——或者至少尽可能地均匀。各部分之和应为原值,但各部分应为整数,且应尽可能接近。 参数 num: Integer - 应该被分成相等部分的数字 parts
我在这里想做的是由偶数消费者打印偶数,由奇数消费者打印奇数。 有一个 evenodd 方法,它基本上消耗任何数字并打印(无论是偶数还是奇数)。我有 2 个偶数消费者线程、2 个奇数消费者线程、2 个偶
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
谁能帮忙。我必须编写一个程序,让用户输入 10 个数字。并将这些数字按奇数(升序)和偶数(降序)排序。 例如:输入:2、8、7、13、23、9、34、11、1、16输出:1、7、9、11、13、23、
给定两个列表,我想合并它们,以便第一个列表中的所有元素都是偶数索引(保留它们的顺序),第二个列表中的所有元素都是奇数索引(也保留它们的顺序)。示例如下: x = [0,1,2] y = [3,4] r
我有一个表,对列和行进行求和,并显示求和的结果。我必须改变每个总数的颜色。如果是偶数,则将其设置为“绿色”。如果是奇数,则将其设置为“红色” 这是我的 table :
我是一名优秀的程序员,十分优秀!