Не удается запустить поток синхронно - PullRequest
0 голосов
/ 11 мая 2018

Привет! Я реализовал свой код, как показано ниже, в двух фрагментах, но все же я не могу добиться синхронизации в потоках, так как мои методы синхронизированы, пока ни один поток не ожидает другого до завершения. не могли бы вы сообщить мне, какую ошибку я допустил в приведенном ниже фрагменте? но когда я помещаю sleep в Thread между ними, он работает нормально, но это не лучший способ реализовать, поместив sleep в Thread

Вариант 1:

public class A{
    public static void main(String args[]){
        C c = new C();
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        B t1 = new B(c);

        for(int i = 1; i <=10; i++) {
            executorService.submit(/*new B(c)*/t1);
        }

        executorService.shutdown();
        try{
                  executorService.awaitTermination(Long.MAX_VALUE,TimeUnit.NANOSECONDS);
        }catch(InterruptedException e){
            System.out.println("Error while checking tread life: "+e);
        }
    }
}

public class B extends Thread{
    C c;
    static final Object lockObject = new Object();
    public B(C c) {
        this.c = c;
    }

    public void run(){
        someProcess();
    }

    synchronized public void someProcess(){
        String something = c.C();
        if(something == null || "".equalsIgnoreCase(something)){
            c.A();
        }else{
            c.B();
        }
    }
}

public class C {
    synchronized public void method A(){
        //insert the recods
    }

    synchronized public void method B(){
        //update the records
    }
    synchronized public String method C(){
        // searching a record to get it's id if it exist
        return something;
    }
}

Вариант 2:

public class A {

    public static void main(String args[]) {
            C c = new C();

            ExecutorService executorService = Executors.newFixedThreadPool(10);
            B t1 = new B(c);

            for(int i = 1; i <=10; i++) {
                executorService.submit(/*new B(c)*/t1);
            }

            if(executorService !=null) {
                executorService.shutdown();
                try {
                     executorService.awaitTermination (Long.MAX_VALUE,TimeUnit.NANOSECONDS);
                }catch(InterruptedException e) {
                    System.out.println("Error while checking tread life: "+e);
                }
            }
    }

}

public class B extends Thread {
    C c;
    static final Object lockObject = new Object();
    public B(C c) {
        this.c = c;
    }

    public void run() {
        someProcess();
    }

    public void someProcess() {
        synchronized(this) {
            String something = c.C();
            if(something == null || "".equalsIgnoreCase(something)) {
                c.A();
            }else{
                c.B();
            }
        }
    }
}

public class C {
    synchronized public void method A() {
        //insert the recods
    }

    synchronized public void method B() {
        //update the records
    }
    synchronized public String method C() {
        // searching a record to get it's id if it exist
        return something;
    }
}

Вариант 3:

public class A {

public static void main(String args[]) {
        C c = new C();

        ExecutorService executorService = Executors.newFixedThreadPool(10);
        B t1 = new B(c);

        for(int i = 1; i <=10; i++) {
            executorService.submit(/*new B(c)*/t1);
        }

        if(executorService !=null) {
            executorService.shutdown();
            try {
                 executorService.awaitTermination (Long.MAX_VALUE,TimeUnit.NANOSECONDS);
            }catch(InterruptedException e) {
                System.out.println("Error while checking tread life: "+e);
            }
        }
}

}

public class B extends Thread {
C c;
static final Object lockObject = new Object();
public B(C c) {
    this.c = c;
}

public void run() {
    someProcess();
}

public void someProcess() {
    synchronized(this) {
        String something = c.C();
        if(something == null || "".equalsIgnoreCase(something)) {
            c.A();
        }else{
            c.B();
        }
    }
}
}

public class C {
public void method A() {
    synchronized(this) {
        //insert the recods
    }
}

public void method B() {
    synchronized(this) {    
        //update the records
    }
}

public String method C() {
    synchronized(this) {    
        // searching a record to get it's id if it exist
        return something;
    }
}
}

Вариант 4:

public class A {

public static void main(String args[]) {
        C c = new C();

        ExecutorService executorService = Executors.newFixedThreadPool(10);
        B t1 = new B(c);

        for(int i = 1; i <=10; i++) {
            executorService.submit(/*new B(c)*/t1);
        }

        if(executorService !=null) {
            executorService.shutdown();
            try {
                 executorService.awaitTermination (Long.MAX_VALUE,TimeUnit.NANOSECONDS);
            }catch(InterruptedException e) {
                System.out.println("Error while checking tread life: "+e);
            }
        }
}

}

public class B extends Thread {
C c;
static final Object lockObject = new Object();
public B(C c) {
    this.c = c;
}

public void run() {
    someProcess();
}

public void someProcess() {
    synchronized(lockObject) {
        String something = c.C(lockObject);
        if(something == null || "".equalsIgnoreCase(something)) {
            c.A(lockObject);
        }else{
            c.B(lockObject);
        }
    }
}
}

public class C {
public void method A(Object lockObject) {
    synchronized(lockObject) {
        //insert the recods
    }
}

public void method B(Object lockObject) {
    synchronized(lockObject) {  
        //update the records
    }
}

public String method C(Object lockObject) {
    synchronized(lockObject) {  
        // searching a record to get it's id if it exist
        return something;
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...