I have two threads in my java programme, one is main thread and other thread is thread A which is spawned in main thread. now i want main thread to start thread A and wait till thread A has executed some part of its code in run method and thread A should suspend itself. main thread should then start running, run few lines of code and then again thread A should start from where it has stopped and vice versa. this should happen for n number of times. I am trying as belows:
Thread A class:
public class ThreadA implements Runnable { boolean suspended = false; boolean stopped = false; synchronized void stop() { stopped = true; suspended = false; notify(); } synchronized void suspend() { suspended = true; } synchronized void resume() { suspended = false; notify(); } void job() throws InterruptedException { for (int i = 0; i < 5; i++) synchronized (this) { System.out.println("performing job."); suspend(); while (suspended) { notify(); suspended = false; } } } @Override public void run() { try { job(); } catch (InterruptedException e) { e.printStackTrace(); } } }
MainThread:
public class MainThread { public static void main(String[] args) throws InterruptedException { ThreadA a1=new ThreadA(); Thread t1=new Thread(a1); synchronized (t1) { t1.start(); for (int i = 0; i < 5; i++) { t1.wait(); System.out.println("perform some action"); a1.resume(); } } } }
Expected output:
performing job. perform some action performing job. perform some action performing job. perform some action performing job. perform some action performing job. perform some action
Actual output:
performing job. performing job. performing job. performing job. performing job. perform some action
I don’t know why the whole for loop is getting executed in Thread A even when i’ve issued a notify() signal in job method.
Advertisement
Answer
Here is more simplified way
public class TwoThread { public static void main(String[] args) throws InterruptedException { ThreadA a1 = new ThreadA(); Thread t1 = new Thread(a1); synchronized (a1) { t1.start(); for (int i = 0; i < 5; i++) { a1.wait(); System.out.println("perform some action " + i); a1.notify(); } } } } public class ThreadA implements Runnable { boolean suspended = false; boolean stopped = false; void job() throws InterruptedException { for (int i = 0; i < 5; i++) synchronized (this) { System.out.println("performing job. " + i); notify(); wait(); } } public void run() { try { job(); } catch (InterruptedException e) { e.printStackTrace(); } } }