Thread.sleep () с синхронизацией в Java - PullRequest
3 голосов
/ 18 декабря 2010

при вызове Thread.sleep (10000) текущий поток переходит в состояние ожидания.Если Thread.sleep (10000) вызывается в методе синхронизации, может ли другой поток выполняться в этот период?

Ответы [ 2 ]

15 голосов
/ 18 декабря 2010

Если вы делаете Thread.sleep(10000) в синхронизированном методе или блокируете, вы не снимаете блокировку. Следовательно, если другие потоки ожидают этой блокировки, они не смогут выполнить.

Если вы хотите подождать некоторое время, пока не произойдет условие, и снять блокировку объекта, вам нужно использовать Object.wait(long)

0 голосов
/ 02 октября 2014
private synchronized void deduct()
{
    System.out.println(Thread.currentThread().getName()+ " Before Deduction "+balance);
    if(Thread.currentThread().getName().equals("First") && balance>=50)
    {
        System.out.println(Thread.currentThread().getName()+ " Have Sufficent balance will sleep now "+balance);
        try
        {
            Thread.currentThread().sleep(100);
        }
        catch(Exception e)
        {
            System.out.println("ThreadInterrupted");
        }
        balance =  balance - 50;
    }
    else if(Thread.currentThread().getName().equals("Second") && balance>=100)
    {
        balance = balance - 100;
    }
        System.out.println(Thread.currentThread().getName()+ " After Deduction "+balance);
    System.out.println(Thread.currentThread().getName()+ " "+balance);
}

Я сделал этот метод синхронизированным, я запускаю два отдельных потока, которые работают одновременно и запускают этот метод, что приводит к нежелательным результатам !! Если я прокомментирую блок try catch, он будет работать нормально, так что использование синхронизированного блока ограничено до тех пор, пока я не буду использовать этот блок try catch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...