2014-01-29 4 views
-1

В приведенном ниже коде, когда я звоню doSomethingCool(x); У меня возникла проблема, когда я не могу получить значение myco.name; когда он находится в боковой нити. Как передать его внутри потока?Почему объект wont не передается из параметра в новый поток

MyCustomObj x = new MyCustomObj(); 
x.name = "test"; 


doSomethingCool(x); 


    protected void doSomethingCool(final MyCustomObj myco) { 
     Thread t = new Thread() { 

      public void run() { 

        //Myco is null why? 
        String sName = myco.name; ////Why wont the object Myco pass through to here? 

      } 
     }; 

     t.start();  
    } 
+1

Почему существует пустой блок catch для 'Exception e'? 1) Вы никогда не должны просто перехватывать все исключения. 2) Вы должны по крайней мере вывести что-то, чтобы указать, что произошло исключение. – skiwi

+2

В чем проблема? Он работает прямо здесь. Можете ли вы дать нам код «MyCustomObj»? И, пожалуйста, отобразите трассировку стека. – Happy

+0

убедитесь, что вы правильно инициализировали перед отправкой метода – stinepike

ответ

1

Вы написали это правильно. Это проблема отладчика.

Я видел такую ​​бессмыслицу с отладкой очень часто в плагине Eclipse/Android. Иногда помогал перезапуск IDE (eclipse). Иногда мне приходилось перезапускать эмулятор. Однажды мне пришлось перезагрузить компьютер (и это было в Linux!).

Также, попробуйте/поймать и установить точки останова в уловы.

+0

спасибо, плохо попробуйте и дайте вам знать –

+0

@ hello-World Привет, если это действительно так, пожалуйста, отредактируйте теги, поместите там свое имя IDE (eclipse/netbeans/IntellijIdea ...) и отладчик. – Gangnus

0

Вам может понадобиться знак MyCustomObj.name в качестве летучего, чтобы гарантировать, что все потоки видеть то же самое значение.

например:

public class MyCustomObj { 
    public volatile String name; 
} 
+0

сохранение volatile как переменной не изменит объект как не нуль – Kick

+0

Спасибо за ответ, но это не работает –

+0

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

-1

Обычно, если нам нужно передать параметры потока, мы можем использовать один из двух подходов, указанных ниже:

  1. Создание пользовательских Runnable, как это :

    public class MyRunnable implements Runnable{ 
    
    private MyCustomObj obj; 
    
    public MyRunnable(MyCustomObj obj) { 
    
        this.obj = obj; 
    
    } 
    
    public void run() { 
    
        System.out.println("Name:" + obj.name); 
    
    } 
    

    }

, а затем

MyCustomObj x = new MyCustomObj(); 
x.name = "test"; 
Thread t = new Thread(new MyRunnable(x)); 
t.start(); 

2.Create пользовательских нити, как показано ниже:

public class MyThread extends Thread{ 

private MyCustomObj obj; 

public MyThread(MyCustomObj obj) { 

this.obj = obj; 

} 

public void run() { 

System.out.println("Name:" + obj.name); 

} 
} 

, а затем

MyThread t = new MyThread(x); 
t.start(); 

Надеется, что это помогают вам

+0

Или # 3 просто получить доступ к переменной в своем объеме, что и делает то, что он делает. – Voo

0

у вас будет значение этой строки. увидеть этот код

цен ниже
public class Exct 
{ 
    Me m=new Me(); 
    String s; 
    public static class Me 
    { 
     public String ht() 
     { 
      return "me"; 
     } 
    } 

    public static void main(String ... args) 
    { 
     Exct c=new Exct(); 
     try 
     { 
      System.out.println(c.call(c.m)+" in main"); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 
    public String call(final Me m) throws Exception 
    { 

     Thread t=new Thread() 
     { 
      public void run() 
      { 
       s=m.ht(); 
       System.out.println(s+" in run"); 

      } 
     }; 
     t.start(); 
     //System.out.println(s+" in run return "); 
     //t.sleep(1); 
     return s; 
    } 
} 

Вот вывод

IS-

нуля в главном меня в беге

, потому что, когда t.start() выполняет он будет искать метод выполнения, но из-за многопоточности функция Java, в то же время выполняются операторы return и возвращаемое значение null.

Теперь, если вы сделаете все, что может подождать нить до тех пор, пока не будет выполнен метод run, возвращаемое значение будет точным.мы можем сделать это, открыв эту печать строку, которая Null, но возврат выполняет через некоторое время или мы можем сделать что нить сон даже 1 секунду будет делать все остальное, и выход будет быть-

меня в перспективе меня в главном

прямо сейчас у меня нет никаких других объяснений, я буду обновлять его, когда найду любое другое хорошее решение.

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