Я пытаюсь создать пример Java-кода утилиты, который мне нужно реализовать с использованием потоков, но я не уверен, что то, что я сделал, является оптимальным.
Вот мой пример использования: основной поток создастдочерняя нить.Дочерний поток создаст два других потока (WebCallThread и RestCallThread), которые будут вызывать веб-службу REST.
Я использовал потоки здесь, поскольку для извлечения значений из вызовов REST требуется некоторое время. В основном, службы REST простовозвращает список пар.
Для простоты, я просто использовал Math.random () здесь просто для генерации кода ...
package com.thread;
import java.util.ArrayList;
import java.util.List;
public class SampleThreads {
static List<Double> dblList = new ArrayList<Double>();
static List<Double> statelList = new ArrayList<Double>();
static boolean webResult = false;
static boolean restResult = false;
public static void main(String[] args) {
System.out.println("Starting ThreadTesting!!!!");
ChildThread childThread = new ChildThread();;
childThread.start();
try {
childThread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(webResult && restResult) {
System.out.println("Success WebCall!!!!");
System.out.println(dblList);
System.out.println(statelList);
}else {
System.out.println("Something gone wrong!!!!!");
}
System.out.println("Finished ThreadTesting!!!!");
}
static class ChildThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Starting ChildThread!!!!");
WebCallThread webThread = new WebCallThread();
webThread.start();
RestCallThread restThread = new RestCallThread();
restThread.start();
try {
webThread.join();
restThread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Finished ChildThread!!!!");
}
}
static class WebCallThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Starting WebCallThread!!!!");
int ctr =0;
while(true) {
if(ctr > 5) {
webResult = true;
System.out.println("Finished WebCallThread!!!!");
return;
}
System.out.println("Adding to WebCallThread :: " + ctr);
dblList.add(Math.random());
ctr++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
static class RestCallThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Starting RestCallThread!!!!");
int ctr =0;
while(true) {
if(ctr > 10) {
restResult = true;
System.out.println("Finished RestCallThread!!!!");
return;
}
System.out.println("Adding to RestCallThread :: " + ctr);
statelList.add(Math.random());
ctr++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Я немного беспокоюсь о своей проверкеесли с webResult и restResult все в порядке, или потокобезопасен. Что, если поток прерывается или происходит сбой при вызове службы REST.Так что можно предположить, что значения не будут обновлены правильно, и я могу записать «Что-то пошло не так !!!!!»сообщение?
if(webResult && restResult) {
System.out.println("Success WebCall!!!!");
System.out.println(dblList);
System.out.println(statelList);
}else {
System.out.println("Something gone wrong!!!!!");
}
Кроме того, я использовал переменные для хранения возвращенного результата REST в моем основном потоке, и я буду выполнять обработку результатов.Значения этих потоков заполняются моим вызовом веб-службы REST.
static List<Double> dblList = new ArrayList<Double>();
static List<Double> statelList = new ArrayList<Double>();
Я не являюсь экспертом по Java Thread, и я только что написал это на лету.Может ли кто-нибудь придираться к моему коду и есть ли вероятность, что он может потерпеть неудачу?Я открыт для предложения по улучшению кода.