2013-02-12 3 views
0

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

@Override 
    public void onClick(View v) { 
     if (!connected) { 
      serverIpAddress = serverIp.getText().toString(); 
      if (!serverIpAddress.equals("")) { 
       Thread cThread = new Thread(new ClientThread()); 
       cThread.start();     
      } 
     } 
    } 
}; 

private OnClickListener communicateListener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     message = messageServer.getText().toString(); 
     if (!serverIpAddress.equals("")) { 
      cThread.run(); 
      //Thread cThread = new Thread(new ClientThread()); 
      //cThread.start(); 
     }     

    } 
}; 

public class ClientThread implements Runnable { 

    public void run() {   
      if (socket==null) 
       connect to the server; 
      else 
       do smth else; 
    } 

Что я хочу connectListener создать нить и нить, чтобы установить соединение. Затем, щелкнув кнопку communicationListener, приложение будет считывать из сокета или записывать в него. Я не знаю, как это реализовать.

Должен ли я назвать поток снова каким-то образом в методе onclick для общенияListener? Или он постоянно работает, и он будет «делать что-то еще», если сокет отличен от нуля?

Я попытался снова вызвать функцию запуска, но получил исключение NullPointerException. Он работает очень хорошо, когда я создаю новый поток в communityListener, но я не хочу создавать новый поток каждый раз, когда я нажимаю кнопку.

Спасибо

ответ

3

Во-первых, никогда не называйте run() метод волоске в; который не будет запускать код в новом потоке, он запускает его в текущем потоке. Вместо этого вызовите его метод start() (чтобы начать новый поток, который скоро будет в методе run()).

Когда поток заканчивается кодом в методе run() (или явно возвращается из метода), поток завершен. Объект все еще может существовать, позволяя вам извлекать данные из него (если есть что угодно), однако поток не может быть запущен заново; вам нужно будет создать новый экземпляр и запустить его.

Если вы намерены создать поток один раз и позволить ему «делать другие вещи» в ожидании реальной работы, вы можете это сделать, но это другая модель использования, чем «начать новый поток, когда Мне нужна моя работа ». Обе модели используют свое место, но модель «начать ее, когда мне это нужно» проще реализовать, и вряд ли эффективность, предоставляемая более сложной моделью, является достаточной для того, чтобы повысить ее значение, когда она привязана к действиям пользовательского интерфейса.

1

Похоже, вы не прочитали никакой документации, прежде чем пытаться их использовать, потому что очевидно, что вы не понимаете про потоки в java. Я бы прочитал следующую главу, если я, где вы: http://docs.oracle.com/javase/tutorial/essential/concurrency/

Но, чтобы подвести итоги, чтобы создать поток: вы вызываете «start()», и поток запускается сам, и вызывайте «run() ". Когда функция run() закончена, нить умирает.

Итак, если вы хотите повторить одно и то же действие, создайте новый экземпляр потока и запустите его снова.

Смежные вопросы