Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程概念/演示_Java_Multithreading_Thread Safety - Fatal编程技术网

Java线程概念/演示

Java线程概念/演示,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我正在尝试编写一个使用线程的Java程序。我希望能够在程序启动时运行3个线程,并让它们在“工单”的ArrayList上等待。 最初,没有工作指令。因此线程应该等待。 在将来的某个时候,工作单将添加到ArrayList中,主线程必须通知线程有工作要做 我希望能够通过扩展线程(而不是实现Runnable)来实现这一点 我认为我遇到的主要问题是线程没有与workorders ArrayList正确同步 我的代码如下所示: public static void main(String[] args)

我正在尝试编写一个使用线程的Java程序。我希望能够在程序启动时运行3个线程,并让它们在“工单”的ArrayList上等待。 最初,没有工作指令。因此线程应该等待。 在将来的某个时候,工作单将添加到ArrayList中,主线程必须通知线程有工作要做

我希望能够通过扩展线程(而不是实现Runnable)来实现这一点

我认为我遇到的主要问题是线程没有与workorders 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());

    }
  }
和胎面等级:

公共类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){}
    }

}
如您所见,在调用workOrders对象上的notify之后,第一个线程的状态更改为Blocked。但是线程和runnable对象都没有执行


任何帮助都将不胜感激。

您应该在java中使用并发集合,以尽可能避免手动同步

我希望能够在程序启动时运行3个线程,并让它们在“工单”的ArrayList上等待。最初,它们将没有工单。因此线程应该等待。在将来的某个时候,工单将添加到ArrayList,主线程必须通知线程有工作要做

对于这种同步,您的朋友是否喜欢在队列中没有项目或队列已满时让线程等待。您不需要在那里进行任何同步/等待/通知

您还可以检查它是否有帮助:


如果只是为了学习,你必须首先在逻辑上使你的同步正确。它不使用任何有问题的等待或通知条件。如果它正确,它会工作,但不是首选方式。

我发现我必须做些什么才能使它工作。主要是缺少的概念。我必须在我想每次调用notifyall时都会调用该方法,但这不是真的调用同步对象时,线程将停止,并使用notify恢复执行,如果该代码不在循环中,则不会执行。

存在许多问题,其中之一是您从未调用另一个可运行的
run.run()
,因此您无法看到另一个可运行的打印…您还调用了
notify
,而不是
notifyAll
,因此只有一个线程被唤醒。@assylias线程是通过调用
start()
方法启动的。
run()
不应从程序员代码中调用。@SJuan76您没有抓住要点。当您重写线程的
run
方法时,它将不再调用传递给构造函数的Runnable。如果您只是使用
LinkedBlockingDeque而不是尝试使用
ArrayList
,则忽略此处的其他问题一切都变得相当容易,如果你想控制多线程工作,考虑自己去执行,而不是用线程自己来做。谢谢。我将能够手动完成它,而不需要一个Link KeBug队列。这只是一个理论练习。我需要理解为什么,线程上没有运行。这是因为W。我在ArrayList上同步?
 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