Deadlock при использовании wait и notify

324
11 января 2017, 00:42

Сегодня приступил к изучению многопоточности на java, не понимаю, почему программа в некоторых случаях выдает корректный результат, а в остальных deadlock.

Задача состоит в том, чтобы обеспечить многоразовый вывод на консоль сначала "I throw a ball", а затем "I got a ball" с использованием wait и notify. Также необходимо получать корректный результат независимо от того, какой поток выполнения стартует первым.

package main;
import java.util.Random;
public class main {
public static void main(String[] args) throws InterruptedException {
     NBAPlayer Oneil = new NBAPlayer();
    Sender sender = new Sender(Oneil);
    Getter getter = new Getter(Oneil);

    for (int i = 0; i < 6; i++) {
        Thread t = new Thread(sender,"sender ");
        Thread th = new Thread(getter,"getter ");t.start();
        Random random = new Random();
        Thread.sleep(random.nextInt(500)+500);
        th.start();
    }
}

static class Sender implements Runnable
{
    NBAPlayer Oneil ;
    public Sender(NBAPlayer oneil) {
        Oneil = oneil;
    }
    public void run() {
        try {
            Oneil.throwBall();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
static class Getter implements Runnable
{
    NBAPlayer Oneil ;
    public Getter(NBAPlayer oneil) {
        Oneil = oneil;
    }
    public void run() {
        try {
            Oneil.getBall();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
static class NBAPlayer
{
    public volatile boolean ready = false;
    public synchronized void throwBall() throws InterruptedException {
        while(ready==false) {
            System.out.println("I throw a ball");
            ready=true;
            notify();
        }
    }
    public synchronized void getBall() throws InterruptedException {
        while(ready==false)
        {
            wait();
        }
        System.out.println("I got your ball");
        ready=false;
    }
}
}
READ ALSO
java - SQL generated keys

java - SQL generated keys

В общем, проблема в том что при SQL запросе на update записи не возвращаются generated keys, хотя запись обновляется, с insert все работает корректно, а вот...

371
Primefaces lazyDataModel filter not working

Primefaces lazyDataModel filter not working

У меня есть две таблицы stock и productТаблицу я инициализирую через stock, но фильтр мне нужно сделать через product

373
Избежать одновременного срабатывания OnDismissListener и onClick

Избежать одновременного срабатывания OnDismissListener и onClick

Этот вопрос является развитием темы Java: обойти необходимость невозможного изменения значения локальной переменной извнеИз ответов на вопрос...

257
Потеря фокуса окон в Swing

Потеря фокуса окон в Swing

Есть приложениеИнтерфейс реализован на Swing

273