Как запустить несколько потоков один за другим, совместно используя список массивов, используя индекс?

#java #android #multithreading

#java #Android #многопоточность

Вопрос:

Я хочу войти в систему с несколькими учетными записями, поэтому я использую потоки .. иногда это работает нормально, но иногда одна и та же учетная запись регистрируется несколько раз вместо оставшихся учетных записей…кто-нибудь, пожалуйста, дает предложения.

   gmail_synclist=new CopyOnWriteArrayList<>();
                gmail_synclist.clear();
                gmail_synclist = Helpers.getArrayList(WelcomeMessage.this, "email_creds");
            List<Thread> threads = new ArrayList<Thread>();
            for( int i = 0; i < gmail_creds.size(); i  ){
                final int j = i;
                Thread t = new Thread(new Runnable() {
                    public void run(){
         synchronized (gmail_synclist) {
                        Helpers.sharedPreferencess(WelcomeMessage.this,"userEmail", gmail_creds.get(j).userEmail);
                        Helpers.sharedPreferencess(WelcomeMessage.this,"userPassword",gmail_creds.get(j).userPassword);
                        AccountSetupBasics.actionNewAccount(WelcomeMessage.this);
        }
                    }
                })
                t.start();
                threads.add(t);
            }

            // Let all threads to finish execution prior continuing main thread.
            try {
                for(Threat t: threads){
                    t.join();
                }
            } catch(InterruptedException ie){
                ie.printStackTrace();
            }
  

Комментарии:

1. вы хотите, чтобы ваша задача выполнялась последовательно или параллельно!

2. спасибо за ответ…. да, я хочу последовательно несколько входов в систему…

3. отлично, тогда используйте один поток обработчика и отправьте runnable для выполнения

4. Хорошо, но я новичок в концепции многопоточности, не могли бы вы, пожалуйста, привести пример кода….

5. Если вы хотите, чтобы это было последовательно, почему вы используете потоки? В последовательном выполнении нет «концепции многопоточности».

Ответ №1:

хорошо, но неправильно отформатирован, я покажу черно-белый фрагмент и поток обработчика

// Простой обработчик потока, класс

 public class MyHandlerThread extends HandlerThread {
private final static String TAG_THREAD = MyHandlerThread.class.getSimpleName();

public MyHandlerThread() {
    super("MyHandlerThread");
    Log.e(TAG_THREAD, " ctor ");
}    
  }
  

// фиктивный фрагмент

 private MyHandlerThread myHandlerThread;
public Handler mWorkerHandler;

int MSG_ONE;
int MSG_TWO;


@Override
public void onViewCreated(whatever) {

 // start the thread
    threadOperation();

// send a message
    sendMessage(MSG_ONE)
}


private void threadOperation() {
    System.out.println("tread started");

    myHandlerThread = new MyHandlerThread();
    myHandlerThread.start();

    Looper looper = myHandlerThread.getLooper();        
    mWorkerHandler = new Handler(looper, new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {


         if(msg.what == MSG_ONE){

           // do your work based on that
          // these are all in bankground thread, so any ui updation task
          // use runOnUiTHread() or main thread handler to post task

            }
            else if(msg.what == MSG_TWO){

            // do work based on two
            }
            return true;
        }
    });
}

public void sendMessage(int whatMsg) {
    System.out.println("send message --------------------");
    doSimulation();
    Message message = mWorkerHandler.obtainMessage(whatMsg);
    mWorkerHandler.sendMessage(message);
    Log.e(TAG, "message sent ..");
}