Java 在多线程处理中使用wait()和notify()
我正在尝试多线程的Java 在多线程处理中使用wait()和notify(),java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在尝试多线程的wait()和notify()方法 我已经想出了一个小项目,我正试图解决多线程。 我有一辆出租车,可以到达6级,我有一位乘客可以到达6级 出租车将比乘客更早到达6级,并等待乘客。 当乘客到达Rank6时,他将通知() 在接到通知后,该出租车将继续循环,并且不会向其他级别发送 Taxi.java package multhithreading.engage.hireForHier; public class Taxi implements Runnable { Rank ra
wait()
和notify()
方法
我已经想出了一个小项目,我正试图解决多线程。
我有一辆出租车,可以到达6级,我有一位乘客可以到达6级
出租车将比乘客更早到达6级,并等待乘客。
当乘客到达Rank6时,他将通知()
在接到通知后,该出租车将继续循环,并且不会向其他级别发送
Taxi.java
package multhithreading.engage.hireForHier;
public class Taxi implements Runnable {
Rank rank = null;
public Taxi(Rank rank) {
this.rank = rank;
}
public void run() {
System.out.println(Thread.currentThread().getName() + " Destined for rank No. " + rank.getRankNo());
synchronized (rank) {
for (int i = 1; i < 10; i++) {
System.out.println("Taxi has reached rank: " + i);
if (i == 6) {
try {
rank.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}// catch
}// if
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}// catch
}// for
}// synchronized
}// run
}
package multhithreading.engage.hireForHier;
public class Passenger implements Runnable {
Rank rank = null;
public Passenger(Rank rank) {
this.rank = rank;
}
public void run() {
System.out.println(Thread.currentThread().getName() + " Destined for rank No. " + rank.getRankNo());
synchronized (rank) {
for (int i = 1; i < 10; i++) {
System.out.println("Passenger has reached rank: " + i);
if (i == 6) {
notify();
}// if
try {
Thread.sleep(180);
} catch (InterruptedException e) {
e.printStackTrace();
}// catch
}// for
}// synchronized
}// run
}
package multhithreading.engage.hireForHier;
public class Rank {
private int rankNo = 0;
public Rank(int rankNo) {
this.rankNo = rankNo;
}
public int getRankNo() {
return rankNo;
}
}
package multhithreading.engage.hireForHier;
public class TaxiHire {
public static void main(String[] args) {
Rank rank6 = new Rank(6);
Taxi taxiNo3 = new Taxi(rank6);
Passenger passengerNo3 = new Passenger(rank6);
Thread taxi_thread = new Thread(taxiNo3, "taxi_thread");
Thread passenger_thread = new Thread(passengerNo3, "passenger_thread");
taxi_thread.start();
passenger_thread.start();
}
}
TaxiHire.java
package multhithreading.engage.hireForHier;
public class Taxi implements Runnable {
Rank rank = null;
public Taxi(Rank rank) {
this.rank = rank;
}
public void run() {
System.out.println(Thread.currentThread().getName() + " Destined for rank No. " + rank.getRankNo());
synchronized (rank) {
for (int i = 1; i < 10; i++) {
System.out.println("Taxi has reached rank: " + i);
if (i == 6) {
try {
rank.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}// catch
}// if
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}// catch
}// for
}// synchronized
}// run
}
package multhithreading.engage.hireForHier;
public class Passenger implements Runnable {
Rank rank = null;
public Passenger(Rank rank) {
this.rank = rank;
}
public void run() {
System.out.println(Thread.currentThread().getName() + " Destined for rank No. " + rank.getRankNo());
synchronized (rank) {
for (int i = 1; i < 10; i++) {
System.out.println("Passenger has reached rank: " + i);
if (i == 6) {
notify();
}// if
try {
Thread.sleep(180);
} catch (InterruptedException e) {
e.printStackTrace();
}// catch
}// for
}// synchronized
}// run
}
package multhithreading.engage.hireForHier;
public class Rank {
private int rankNo = 0;
public Rank(int rankNo) {
this.rankNo = rankNo;
}
public int getRankNo() {
return rankNo;
}
}
package multhithreading.engage.hireForHier;
public class TaxiHire {
public static void main(String[] args) {
Rank rank6 = new Rank(6);
Taxi taxiNo3 = new Taxi(rank6);
Passenger passengerNo3 = new Passenger(rank6);
Thread taxi_thread = new Thread(taxiNo3, "taxi_thread");
Thread passenger_thread = new Thread(passengerNo3, "passenger_thread");
taxi_thread.start();
passenger_thread.start();
}
}
我得到的结果是:
taxi_thread Destined for rank No. 6
Taxi has reached rank: 1
passenger_thread Destined for rank No. 6
Taxi has reached rank: 2
Taxi has reached rank: 3
Taxi has reached rank: 4
Taxi has reached rank: 5
Taxi has reached rank: 6
Passenger has reached rank: 1
Passenger has reached rank: 2
Passenger has reached rank: 3
Passenger has reached rank: 4
Passenger has reached rank: 5
Passenger has reached rank: 6
Exception in thread "passenger_thread" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at lesson9.engage.hireForHier.Passenger.run(Passenger.java:20)
at java.lang.Thread.run(Unknown Source)
我需要知道为什么会抛出异常,对我来说,它看起来像是滑行线程没有拿回锁。
这个场景应该如何实现,滑行线程如何继续循环
非常感谢您的帮助。错误在乘客类中,您同步rand对象,但通知此对象 所以你的代码是
if (i == 6) {
notify();
}// if
应该是
if (i == 6) {
try{rank.notify();
}catch(Exception ex){/*When no any thread is waiting for rank object.*/}
}// if
还有一种可能是滑行线程先到达,所以在这里你们也会遇到异常,因为并没有任何线程在等待rank对象
因此,首先启动滑行线程,然后启动乘客,最好的可靠方法是使用滑行线程调用乘客线程。它可以确保你先打车
这可能有助于您应对可能出现的情况
if (i == 6) {
notify();
这里您没有调用rank.notify()
,因此默认行为将尝试调用此
对象(乘客
对象)上的notify,这将抛出非法监视器状态异常
,因为您没有锁定此
当您尝试wait()
或notify()
或notifyAll()时,会发生IllegalMonitorStateException
在一个对象上没有锁定该对象
解决方案:
if (i == 6) {
rank.notify();
谢谢Narendra,这非常有帮助。谢谢用户251414,这非常有帮助。我很高兴我能帮忙:)有一个很好的并行应用程序。