2013-12-04 3 views
3

сказать, у меня есть класс под названием «Пример»Внутренний класс исполняемым в Java

внутри «Пример» У меня есть внутренний класс, который является исполняемым

Выполнения работоспособной внутри «Пример»

public class Example { 
    public Example() { 
     //executing the runnable here 
    } 

    private void a() { 
    } 
    public void b() { 
    } 

    public class RunMe implements Runnable { 

     public void run() { 
      a(); 
      b(); 
     } 

    } 
} 

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

выполняет a и b из потока RunMe или основного потока?

Имеет ли значение, что a является частным, а b является общедоступным?

+1

Я не вижу нити в вашем коде: предполагая, что вы создаете в качестве примера из примера, передайте runnable в Thread и выполните его Runme выполняется в потоке, можете видеть a и b, поскольку это внутренний класс no модификаторы материи. – ilmirons

+1

Да, я имел в виду выполнение runnable в потоке в конструкторе примера, поэтому вы хотите сказать, что оба метода Example будут выполняться в потоке, а не в основном потоке? –

ответ

0

Если ваш пример конструктор имеет в нем

new Thread(new RunMe()).start() 

затем() и Ь() будет работать на этой теме.

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

4

Вы пропустили ключевую часть кода, чтобы мы могли ответить на ваш вопрос - конструктор.

Если ваш конструктор выглядит следующим образом:

public Example() { 
    (new Thread(new RunMe())).start(); 
} 

Тогда a() и b() будет работать на потоке вы только что создали (в «Runme» нить, как вы его называете).

Однако, если ваш конструктор выглядит следующим образом:

public Example() { 
    (new RunMe()).run(); 
} 

Тогда вы на самом деле не работает на другом потоке (вы просто вызываете метод в другом классе, это просто происходит называться " run '), и поэтому a() и b() будут работать в «основной» нити.

Частная/общественная вещь здесь неактуальна, потому что RunMe является внутренним классом, поэтому можно получить доступ даже к приватным методам Example.

0

Внутренний класс - это всего лишь магический вид извлеченных/преобразованных.

public static class Example$RunMe implements Runnable { 

    // Autocode 
    private final Example $this; 
    public RunMe(Example _this){ 
     $this=_this; 
    } 

    public void run() { 
     $this.a(); // even if private 
     $this.b(); 
    } 

} 

Так нить вы звоните run является Thread a() и b() называют, это не имеет никакого значения, если они являются государственными или частными.

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