2016-06-07 5 views
2

Я знаю, что это немного наивный вопрос, но я хочу понять основной принцип работы многопоточности в java. Рассмотрим следующий код и скажем, что A выполняется в основном потоке и запускает выполнение другого рабочего потока, определенного в классе B. Я хочу знать, что B.func1 вызывается из A и запускает метод B, выполняется параллельно или нет ?Вызов метода класса, который расширяет Thread, из другого класса

public class A { 
    public static void main(String[] args) { 
     B obj = new B(); 
     obj.start(); 
     obj.func1(); 
    } 
} 

public class B extends Thread { 
    public B() { 
     //constructor 
    } 
    public void run() { 
     while(true) { 
      //do somethings 
     } 
    } 
    public void func1() { 
     //do someotherthings 
    } 
} 
+1

@HovercraftFullOfEels общие поля должны быть должным образом синхронизированы, для некоторых случаев их волатильность будет достаточной, но для других случаев это может быть связано с другими механизмами синхронизации. – bowmore

+2

@HovercraftFullOfEels, IMO, вы будете приводить в движение без изменений, сообщая им синхронизировать _methods_. Единственная цель синхронизации - защитить _data_. Часто мы говорим о необходимости синхронизации метода, когда мы действительно имеем в виду, нам нужно синхронизировать некоторый бит данных, который является _exclusive_ доступным методом. Но чаще всего к одним и тем же данным можно обращаться несколькими способами. Noobs должны узнать, что 'synchronized' не работает, если только один бит кода, который обращается к общим данным,« синхронизирован »на _same object_. –

+0

@jameslarge: вы правы. Комментарий удален, и спасибо за разъяснение/исправление. –

ответ

5

Волна вызова метода отсутствует. Если вы вызываете метод из потока, он вызывается точно в том же потоке. Так как obj.func1() вызывается из main, он будет запускаться в основном потоке. Не имеет значения, к какому классу он относится, или расширяет ли он Thread.

Новый поток начинается с выполнения run. Все вызовы от запуска и т. Д. Будут выполняться параллельно с main.

+0

Просто понял, что вы исправили исходный код, о котором идет речь :) –

1

С кодом возникает несколько проблем. Я скорректировал их и добавил еще одно заявление для печати Thread Name в func1().

Рабочий код:

public class A { 
    public static void main(String args[]){ 
     B obj = new B(); 
     obj.start(); 
     obj.func1(); 
    } 
} 

class B extends Thread{ 
    public B(){ 
     //constructor 
    } 
    public void run(){ 
     while(true){ 
      //do somethings 
     } 
    } 
    public void func1(){ 
     //do someotherthings 
     System.out.println("Thread name="+Thread.currentThread().getName()); 
    } 
} 

выхода:

Thread name=main 

Поскольку вы прямой вызов func1() от основного метода (A.java), вы получите Thread name = main выпуска продукции.

При добавлении же самый оператор печати run() метода, вы получите выход как: Thread name=Thread-0

1

Важно понимать разницу между нитью и Thread.

A нить - это независимое выполнение вашего кода. Часто, когда мы говорим о том, как какой-то способ или другие работы мы говорим, что-то вроде «Он проверяет переменную x, и если x меньше нуля вызывает метод foobar ...»

Хорошо, но что такое " это "в этом предложении? Это не метод. Методы не do ничего. Метод - это всего лишь список инструкций, таких как список обязанностей, которые кто-то оставил для своего хозяина дома. Список не выполняет обязанности, это соседка, которая делает работу (или, таким образом, мы можем надеяться).

«Это» - это нить. Потоки - это объекты в операционной системе, которые выполняют методы (т. Е. Выполняют обязанности).

А Thread, с другой стороны, представляет собой объект Java, который ваша программа может использовать для создания и управления новыми потоками . Ваша программа создает новый объект Thread, выполнив:

thread t = new Thread(...); 

[Oops! Посмотрите, что я только что сделал?Это не твоя программа, которая делает работу, это основная твоя программа Основная статья, или, может быть, другая тема в вашей программе. ! Это легкая вещь, чтобы забыть]

Во всяком случае, впоследствии он создает новую нити по телефону t.start();


После того, как вы понимаете, все это, то ответ Сергея Tachenov становится очевидным: Вызов Методы Thread Объект действительно ничем не отличается от методов вызова любого другого объекта.

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