Невозможно выполнить синхронизированный поток - PullRequest
0 голосов
/ 02 мая 2020

Я попробовал код из Учебника о синхронизированном потоке. Пробовал писать код как есть. Но получаю сообщение об ошибке:

cannot find symbol f.start(); and t.display();

Код учебника должен был пробоваться без синхронизированного ключевого слова. Но, похоже, компилятор не может распознать объект. Пожалуйста, помогите ..

class First 
{
    synchronized void display (String s)
    {
        System.out.println(s);

        try
        {
            Thread.sleep(1000);
        }
        catch(InterruptedException e)
        {
            System.out.println("Interrupted");  
        }
        System.out.println("***");
    }
}

class Second  implements Runnable 
{
    String s;
    First f;    
    Thread t;

    public Second(First f1,String s1)
    {
        f=f1;
        s=s1;
        t=new Thread(this);
        f.start();
    }

    public void run()
    {
        t.display(s);
    }
}

class SyncThread
{
    public static void main(String args[])
    {
        First f=new First();
        Second ob1=new Second(f,"First");
        Second ob2=new Second(f,"Second");
        Second ob3=new Second(f,"Third");

        try
        {
            ob1.t.join();
            ob2.t.join();
            ob3.t.join();
        }
        catch(InterruptedException e)
        {
            System.out.println("Interrupted");
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 02 мая 2020

Вместо выполнения

t = new Thread(this);
f.start();

try:

t = new Thread(this);
t.start();

и в методе run попробуйте f.display() вместо t.display()

Looks как будто вы перепутали некоторые переменные. Попробуйте использовать несколько значимых имен вместо f и t. Труднее испортить thread.start() и first.display(), чем t.start() и f.display().

0 голосов
/ 02 мая 2020

Это выдает ошибку, возможно, из-за того, что вы не использовали аннотацию @Override над функцией run (). Вот пересмотренный код:

 @Override
public void run()
{
    f.display(s);
}

И, пожалуйста, не запускайте поток в конструкторе, так как это небезопасно, также вы допустили ошибку, так как это должно быть t.start (), а не f.start (), аналогичные изменения в run () должны относиться к f.display (s), а не к t.display (s).

Изменения:

@Override
public void run()
{
    f.display(s);
}

И:

t=new Thread(this);
    t.start();

Запомните ваши переменные, потому что это вызовет такие проблемы! Теперь программа должна работать без ошибок!

0 голосов
/ 02 мая 2020

Класс потока не имеет метода отображения, а ваш класс First имеет метод отображения. Я думаю, что вы неправильно набрали t.display () и f.start (). Попробуйте переключиться на f.display () и t.start ().

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