【发布时间】:2019-11-28 18:09:55
【问题描述】:
我用线程和信号量编写了交通规则代码。
我认为我的代码没问题,但它不起作用。我的意思是它不会锁定我在第一个线程下写的第二个线程。我怎样才能找到我的错误?为什么这不锁定我的第二个线程?
我想看到这个结果: 我将有 6 辆车在交通中。 3 辆车在一条路线上(坐标不同),另外 3 辆车在另一条路线上(坐标不同)。比如A坐标是5,B是10,C是15。
相反,D 是-6,E 是-11,F 是-16。有路口。如果 A、B 和 C 车点正在减少(每两秒它们协调减少 1 减 1)。他们想要达到“upTarget”,例如 3。并且 D、E、F 坐标一一增加以达到 -3。如果 A 在 D 到达他的左目标(到 -3)之前到达上目标(到 3),所有左行将等到上行离开 0,0 坐标
我的意思是如果A达到3,那么A B C线将绿灯熄灭,D,E,F将等待它们直到C坐标为0
主类
package sample;
import java.util.Scanner;
import java.util.concurrent.Semaphore;
public class Main {
public static int x1,x2,x3,y1,y2,y3,upTarget,leftTarget;
public static void main(String[] args) throws InterruptedException{
Scanner obj=new Scanner(System.in);
System.out.println("Insert coordinant of A");
x1=obj.nextInt();
System.out.println("Insert coordinant of B");
x2=obj.nextInt();
System.out.println("Insert coordinant of C");
x3=obj.nextInt();
System.out.println("Insert coordinant of D");
y1=obj.nextInt();
System.out.println("Insert coordinant of E");
y2=obj.nextInt();
System.out.println("Insert coordinant of F");
y3=obj.nextInt();
System.out.println("Insert up target level");
upTarget=obj.nextInt();
System.out.println("Insert left target level");
leftTarget=obj.nextInt();
System.out.println("Traffic was start");
Semaphore sem=new Semaphore(1);
Thread t1=new MyBackend(sem,x1, x2, x3, upTarget, y1, y2, y3, leftTarget,"A");
Thread t2=new MyBackend(sem,x1, x2, x3, upTarget, y1, y2, y3, leftTarget,"B");
t1.start();
t2.start();
t1.join();
t2.join();
}
}
我的后端代码 => 我的线程类
import java.util.concurrent.Semaphore;
public class MyBackend extends Thread{
Semaphore sem;
private int x1,x2,x3,y1,y2,y3,upTarget,leftTarget;
private String value;
public MyBackend(Semaphore sem,int x1,int x2,int x3,int upTarget,int y1,int y2,int y3,int leftTarget,String value){
super(value);
this.sem=sem;
this.x1=x1;
this.x2=x2;
this.x3=x3;
this.y1=y1;
this.y2=y2;
this.y3=y3;
this.upTarget=upTarget;
this.leftTarget=leftTarget;
this.value=value;
}
@Override
public void run() {
System.out.println("yeeeeeeeeeeeeeeeeeeeeeeeeeee"+sem.availablePermits());
if(this.getName().equals("A")){
try{
while(x3>=0){
x1=x1-1;
x2=x2-1;
x3=x3-1;
Thread.sleep(2000);
System.out.println("A coordinate "+x1);
System.out.println("B coordinate "+x2);
System.out.println("C coordinate "+x3);
if(x1==upTarget){
sem.acquire();
System.out.println("yeeeeeeeeeeeeeeeeeeeeeeeeeee"+sem.availablePermits());
System.out.println("First line was reached!!!");
}
}
}catch(Exception e){}
sem.release();
}
else {
try{
while(y3<=0){
y1=y1+1;
y2=y2+1;
y3=y3+1;
Thread.sleep(2000);
System.out.println("D coordinate "+y1);
System.out.println("E coordinate "+y2);
System.out.println("F coordinate "+y3);
if(y3==leftTarget){
sem.acquire();
System.out.println("Second line was reached!!!");
}
}
}catch(Exception e){}
sem.release();
} }
}
【问题讨论】:
-
你在观察什么,你到底期待什么?注意分享任何输出!
-
我将有 6 辆车在路上行驶。 3 辆车在一条路线上(坐标不同),另外 3 辆车在另一条路线上(坐标不同)。例如,A 坐标为 5,B 为 10,C 为 15。相反,D 为 -6,E 为 -11,F 为 -16。有路口。如果 A、B 和 C 车点正在减少(每两秒它们协调减少 1 减 1)。他们想达到“upTarget”,例如 3。 D、E、F 坐标一一递增以达到 -3。如果 A 在 D 到达左目标(到 -3)之前到达上目标(到 3),则所有左行将等到上行离开 0,0 坐标。
-
我的意思是如果 A 达到 3 则 A B C 线将绿灯熄灭,D,E,F 将等待它们直到 C 坐标为 0
标签: java multithreading semaphore