簡體   English   中英

Java Thread概念/演示

[英]Java Thread concept / demo

我正在嘗試編寫一個使用線程的Java程序。 我希望能夠運行3個線程在程序啟動時,並讓他們等待的“工作單”的ArrayList。 最初,劇場將沒有工作指令。 因此線程應等待。 在將來的某個時候,工作指令將添加到ArrayList中,並且主線程必須通知線程有工作要做。

我希望能夠通過擴展Thread(而不是實現Runnable)來做到這一點。

我認為主要的問題我已經是線程都不能正確地與工作訂單ArrayList的同步。

我的代碼如下所示:

  public static void main(String[] args) {

    AnotherRunnable anotherRunnable = new AnotherRunnable();
    ArrayList<ATMRunnable> workOrders = new ArrayList<ATMRunnable>();

    T1 t1 = new T1(anotherRunnable, workOrders);
    T1 t2 = new T1(anotherRunnable, workOrders);

    t1.start();
    t2.start();

    try{
        Thread.sleep(2000);
    }
    catch(InterruptedException e){}

        synchronized (workOrders){

        System.out.println(t1.getState() + " - " + t1.getName());
        System.out.println(t2.getState() + " - " + t2.getName());

        System.out.println("notify");
        workOrders.notify();

        System.out.println(t1.getState() + " - " + t1.getName());
        System.out.println(t2.getState() + " - " + t2.getName());

    }
  }

該AnotherRunnable類:

public class AnotherRunnable implements Runnable {

public void run()
{
    System.out.println("AnotherRunnable");

}
}

和Tread類:

公共類T1擴展了線程{

 AnotherRunnable anotherRunnable;
ArrayList<ATMRunnable> workOrders;

ATMThread(AnotherRunnable anotherRunnable, ArrayList<ATMRunnable> workOrders)
{
    this.anotherRunnable = anotherRunnable;
    this.workOrders = workOrders;
}

public void run()
{
    System.out.println("Run Thread");

    synchronized (workOrders){
        try{
            System.out.println("wait Thread");
            workOrders.wait();
        }
        catch (InterruptedException e){}
    }

}

}

這是程序的輸出:

Run Thread
wait Thread
Run Thread
wait Thread
WAITING - Thread-1
WAITING - Thread-2
notify all
BLOCKED - Thread-1
WAITING - Thread-2

如您所見,在對workOrders對象進行通知的調用之后,第一個線程的狀態更改為“已阻止”。 但是線程和可運行對象均未執行。

任何幫助將不勝感激。

您應該在Java中使用並發集合,以盡可能避免手動同步。

我希望能夠運行3個線程在程序啟動時,並讓他們等待的“工作單”的ArrayList。 最初,劇場將沒有工作指令。 因此線程應等待。 在將來的某個時候,工作指令將添加到ArrayList中,並且主線程必須通知線程有工作要做。

對於這種同步, 阻塞隊列是您喜歡的LinkedBlockingQueue之類的朋友,當隊列中沒有任何項目或隊列已滿時,它們使線程等待。 您不需要在那里進行任何同步/等待/通知。

您還可以檢查是否有幫助: 同步存在風險

如果僅出於學習目的,則必須首先在邏輯上使同步正確。 它不使用任何條件等待或通知問題。 如果合適,它將起作用,但不是首選方法。

我發現我需要做些什么才能使它工作。 主要是缺少該概念。 我不得不循環運行線程的方法。 我以為每次調用notifyall都會調用該方法,這是不正確的。 當在同步對象上調用wait()時,線程將停止,並通過通知它恢復執行,如果該代碼不在循環中,則將不執行該線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM