Thread pausing/resuming implementation
The implementation looks fine. Some small notes:


Consider using Guava's Uninterruptibles class if you don't want to handle InterruptedExceptions.
The default access waiting flag in Thread1 is makes the code hard to read/follow and results tight coupling.
Consider using Runnables instead of Threads. See: Java: “implements Runnable” vs. “extends Thread”
Consider synchronizing on a separate lock object: Avoid synchronized(this) in Java?


Anyway, it would be much easier, less error-prone and more readable with a fair Semaphore (from the concurrency utilities package):

App.java:

public class App {

    public static void main(final String[] args) throws InterruptedException {
        final Semaphore control = new Semaphore(1, true);

        final Thread1 thread1 = new Thread1(control);
        final Thread2 thread2 = new Thread2();

        thread1.start();
        Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS);
        control.acquireUninterruptibly();
        thread2.start();
        thread2.join();
        control.release();
    }
}


Thread1.java:

public class Thread1 extends Thread {
    private final Semaphore control;

    public Thread1(final Semaphore control) {
        this.control = control;
    }

    @Override
    public void run() {
        for (int i = 1; i &lt; 10; i++) {
            control.acquireUninterruptibly();
            try {
                Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS);
                System.out.println("From testFun1() = " + i);
            } finally {
                control.release();
            }
        }
    }
}


Thread2.java:

public class Thread2 extends Thread {

    public void run() {
        for (int i = 20; i &lt;= 25; i++) {
            Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS);
            System.out.println("From testFun2() = " + i);
        }

    }
}