2015-06-18 2 views
0

Я пытаюсь вызвать runnable thread, который помещает элемент в LinkedBlockingList. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу запустить внутренние методы. Выполняется только внешний метод. Я знаю, что мне нужно добавить строки кода ниже в комментарии, но я действительно не знаю.Invoke runnable внутри метода и объекта пропуска

public void prod(TwitterObj obj) { 
System.out.println("Prod Outer"); 
class Producer implements Runnable { 

    TwitterObj obj; 
    @Override 
    public void run() { 
     try { 
      queue.put(obj); 
      System.out.println("Put OBJ into queue: " + obj.getMsg()); 
      ++i; 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    }; 

    //invoke thread 
}} 

Сообщение «Prod Outer» отображается, но внутренний класс вообще не работает. Любая обратная связь будет принята с благодарностью!

EDIT 1:

Это мой код, который я слушать мой собственный поток щебет и добавить значения в объект

public void onStatus(twitter4j.Status status) { 
       System.out.println("onStatus @" + status.getUser().getScreenName() + " - " + status.getText() + " - " + status.getCreatedAt()); 

       obj.setMsg(status.getText()); 
       obj.setDateTime(String.valueOf(status.getCreatedAt())); 
       obj.setId((int) status.getId()); 
       prod(obj); 
      } 

ответ

1

Если вы хотите знать, как передать TwitterObj на ваш Runnable вот как это сделать.

class Producer implements Runnable { 
    private TwitterObj obj; 

    public Producer(TwitterObj obj) { 
     this.obj = obj; 
    } 

    @Override 
    public void run() { 
     try { 
      queue.put(obj); 
      System.out.println("Put OBJ into queue: " + obj.getMsg()); 
      ++i; 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    }; 
} 

Теперь вы можете создать Producer следующим образом:

TwitterObj twitterObj = ....; 

Producer producer = new Producer(twitterObj); 
Thread t = new Thread(producer); 
t.start(); 

В частности заменить

public void onStatus(twitter4j.Status status) { 
    System.out.println("onStatus @" + status.getUser().getScreenName() + " - " + status.getText() + " - " + status.getCreatedAt()); 

    obj.setMsg(status.getText()); 
    obj.setDateTime(String.valueOf(status.getCreatedAt())); 
    obj.setId((int) status.getId()); 
    prod(obj); 
} 

с

public void onStatus(twitter4j.Status status) { 
    System.out.println("onStatus @" + status.getUser().getScreenName() + " - " + status.getText() + " - " + status.getCreatedAt()); 

    obj.setMsg(status.getText()); 
    obj.setDateTime(String.valueOf(status.getCreatedAt())); 
    obj.setId((int) status.getId()); 

    // prod(obj); removed and replaced with the 3 lines below 
    Producer producer = new Producer(twitterObj); 
    Thread t = new Thread(producer); 
    t.start(); 
} 
+0

Hi Давиде, но это не создавая новый объект? Я отредактировал мои коды, PLS, посмотрите, спасибо! – Gene

+0

Плохо, я думаю, вы, возможно, правы. lemme попробуйте это спасибо! – Gene

+0

Если вам нужно запустить новую тему, вам нужно создать новый Runnable Object. –

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