Надеюсь, что мне тут помогут, потому что я уже 3 дня пытаюсь понять эту программу Суть программы- реализация методов для приостановки, возобновления и останова потока. Код взят из книги Герберта Шилдта для начинающих, 9-е издание. Страница 447. Писал я его не точь-в-точь, но думаю суть ясна.
class MyThread implements Runnable{
    Thread thrd;
    boolean suspended;
    boolean stopped;

    MyThread(String name){
        thrd= new Thread(this,name);
        suspended=false;
        stopped=false;

    }
    public static MyThread createAndStart(String name){
        MyThread mt = new MyThread(name);
        mt.thrd.start();
        return mt;

    }
    public void run(){
       try{
           for(int i=1;i<1000;i++){
               System.out.print(i + " ");
               if(i%10==0){
                   System.out.println();
                   Thread.sleep(250);
               }
               synchronized(this){
                   while(suspended) wait();
                   if(stopped) break;
               }
           }

           }
        catch(InterruptedException e){

       }
    }
    synchronized void myStop(){
        stopped=true;
        suspended=false;
        notify();
    }
    synchronized void mySuspend(){
        suspended = true;
    }
    synchronized void myResume(){
        suspended=false;
        notify();
    }

}

public class Suspend {
    public static void main(String[] args){
        MyThread mt1 = MyThread.createAndStart("Thread 1");
        try{
            Thread.sleep(1000);
            mt1.mySuspend();
            Thread.sleep(1000);
            mt1.myResume();
            Thread.sleep(1000);
            mt1.mySuspend();
            Thread.sleep(1000);
            mt1.myResume();
            Thread.sleep(1000);
            mt1.mySuspend();
            mt1.myStop();


        }
        catch(InterruptedException e){

        }
    }

}
Теперь к моим вопросам: 1) конструкцию synchronized(this) мой мозг отказывается понимать. Зачем она нужна, если методы и так synchronized? Да и что мы в этом блоке синхронизируем? Операторы while и if??? 2) зачем в методе main используется Thread.sleep() если суть синхронизации как раз в том чтоб потоки автоматически получали доступ к объекту? 3) В книге в предыдущих упражнения обычно создавался отдельный класс, и через его методы потоки уже выполняли свои дела, а в этой программе для этого используется сам же класс, который реализует интерфейс Runnable. Это вообще как и нафига??! Буду премного благодарен за пояснения