Gerçek zamanlı envanter sağlayan bir uygulamada çalışan iki web hizmeti vardır. Bu iki arayüzden envanteri okumak ve toplam envanteri hesaplamak için bir java çok iş parçacığı programı yazmam gerekiyor.İki web hizmetini çoklu iş parçacığı kullanarak nasıl topluyorum?
Ön koşul: Her iki dişin de gecikme olmaksızın başlatılması gerekir.
Aşağıdaki kodu kullanarak bu soruna yaklaşmayı denedim. Lütfen bu doğru olup olmadığını kontrol edin ve bildirin. Ayrıca mevcut başka bir alternatif yaklaşım var. Eğer Runnable
parçacığı hem tek bir seferde etkin olabilir çünkü onların tüm yürütülmesi için senkronize edilirse çoklu kullanım gelen herhangi bir iyileşme göreceksiniz eğer bilmiyorum
package com.app.thread;
public class InventoryThread {
public static void main(String a[]) throws InterruptedException {
Inventory inv = new Inventory();
InventoryInterface1 i1 = new InventoryInterface1(inv);
InventoryInterface2 i2 = new InventoryInterface2(inv);
Thread t1 = new Thread(i1, "T1");
Thread t2 = new Thread(i2, "T2");
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(inv.getInventory());
}
}
class Inventory {
private long inventory;
public long getInventory() {
return inventory;
}
public void setInventory(long inventory) {
this.inventory = inventory;
}
}
class InventoryInterface1 implements Runnable {
private Inventory inv;
public InventoryInterface1(Inventory inv) {
this.inv = inv;
}
public void run() {
System.out.println(Thread.currentThread().getName() + " running");
synchronized (inv) {
System.out.println(Thread.currentThread().getName() + " updates inventory");
inv.setInventory(inv.getInventory() + 100);
}
}
}
class InventoryInterface2 implements Runnable {
private Inventory inv;
public InventoryInterface2(Inventory inv) {
this.inv = inv;
}
public void run() {
System.out.println(Thread.currentThread().getName() + " running");
synchronized (inv) {
try {
System.out.println(Thread.currentThread().getName() + " waiting..");
while(inv.getInventory() <= 0){
inv.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " updates inventory");
inv.setInventory(inv.getInventory() + 200);
System.out.println(Thread.currentThread().getName() + " notifies");
inv.notifyAll();
}
}
}
InventoryInterface1
veInventoryInterface2
değiştirilir. Örneğinizde birkaç örnekte yanlışlık var. Özünde –@loannis gibi bir öğreticiye ihtiyaç var java'da eşzamanlılık öğreniyorum ve çözmek istediğim problem için uzman girişleri almak istedim. Teşekkürler! – Vel