Как вывести результаты за пределы темы в java - PullRequest
0 голосов
/ 02 мая 2020

Я хочу запустить 2 кода одновременно в java, поэтому я использовал поток. Здесь я хочу получить результаты как из потока 1, так и из потока 2. Пожалуйста, помогите Также я не получаю поток. любой способ получить результаты

    Thread thread1 = new Thread() {
    private Object result;

    @Override
    public void run() {
        takeInfofromDB();
        result = doSomeLongCalculationsWithThatData();
    }

    public Object getResult() {
        return result;
    }
}

Thread thread2 = new Thread() {
    private Object result;

    @Override
    public void run() {
        takeInfofromDB2();
        result = doSomeLongCalculationsWithThatData2();
    }

    public Object getResult() {
        return result;
    }
}

thread1.start();
thread2.start();
thread1.join();
thread2.join();

Object result1 = thread1.getResult();
Object result2 = thread2.getResult();

Ответы [ 2 ]

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

Это точно работа на будущее.

ExecutorService service = Executors.newFixedThreadPool(2);

Future<Object> future1 = service.submit( ()->{
     takeInfofromDB();
     return doSomeLongCalculationsWithThatData();
} );

Future<Object> future2 = service.submit( ()->{
     takeInfofromDB2();
     return doSomeLongCalculationsWithThatData2();
} );
Object result1 = future1.get();
Object result2 = future2.get();

Также на другой ноте. С java 11 и выше вы можете использовать var.

var thread1 = new Thread() {
    private Object result;

    @Override
    public void run() {
        takeInfofromDB();
        result = doSomeLongCalculationsWithThatData();
    }

    public Object getResult() {
        return result;
    }

}

Тогда он сохраняет ваши новые методы.

thread1.start();
thread1.join();
Object result = thread1.getResult();
0 голосов
/ 02 мая 2020

thread1 и thread2 являются экземплярами класса Thread, у которого нет метода getResult(). Вы должны создать свои собственные неанонимные классы, которые расширяют Thread.

public class Db1Thread extends Thread {
    private Object result;

    @Override
    public void run() {
        takeInfofromDB();
        result = doSomeLongCalculationsWithThatData();
    }

    public Object getResult() {
        return result;
    }
}

А затем

Db1Thread thread1 = new Db1Thread();
thread1.start();
thread1.join();
Object result1 = thread1.getResult();

PS, лучше использовать CompletableFuture из Java 8+. Вот краткое руководство https://www.baeldung.com/java-completablefuture

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