2016-08-05 3 views
2
public Demo implements Runnable(){ 
    private String threadName; 
    public Thread t; 

    public Demo(String name){ 
    this.threadName = name; 
    } 

    public void begin(){ 
     t = new Thread(this,threadName); 
     t.start(); 
    } 

    public void run(){ 
     Thread.sleep(1000); 
     System.out.println("Running"); 
    } 
} 

public static void main(String args[]) { 
    Demo demo1 = new Demo("DEMO1"); 
    demo1.begin(); 
    Demo demo2 = new Demo("DEMO2"); 
    demo2.begin(); 
} 

Хорошо, я немного запутался в теме, даже после чтения API и документации. Я понимаю, что если вы либо реализуете Runnable(), либо расширяете класс Thread, он создает собственный поток.Сколько потоков существует здесь?

В этом случае Публичный static void main() создает «Основной поток», а затем его дети являются 2 последующими потоками (объекты Demo), а после вызова «begin()» есть еще 2 потоки, связанные с объектами Demo.

  1. В этом коде 5 статей.
  2. Thread.sleep (1000), кажется, останавливает все потоки, поэтому он имеет в виду «главную тему»?
  3. Если я вызову synchronized (this) в методе run() внутри класса Demo, у Demo1 есть свой монитор, в то же время Demo2 владеет своим монитором, выполняя свою собственную задачу одновременно? Или потому, что они разделяют один общий «Основной монитор», они запускаются по одному за раз, ожидая очереди.

ответ

2

start()Thread объект начинает новую тему. Обычный Runnable не создает новые темы, только Thread объектов.

В этом коде 5 статей.

Существует три потока.

Thread.sleep (1000), кажется, останавливает все потоки.

Он вызывается из двух новых потоков и задерживает их на одну секунду.

Причина, по которой вся программа останавливается, заключается в том, что программа не завершается, если есть другие активные потоки (если только эти потоки не являются daemon threads, а это не так). Основной поток уже выйдет, но наличие двух дополнительных потоков приведет к продолжению работы программы до тех пор, пока эти потоки не закончатся.

Если я позвоню synchronized(this) в run() методе в демонстрационном классе, Demo1 имеет владеет его монитором одновременно Demo2 владеет его монитором, выполняет свою собственную задачу одновременно?

Нити будут блокироваться, только если они синхронизируются на одном объекте. this относится к двум различным объектам, поэтому потоки не будут блокировать друг друга.

1

Я понимаю, что если вы либо реализуете Runnable(), либо расширяете класс Thread, он создает свой собственный поток.

Тема будет создана только при непосредственном создании потока. Ваш begin() метод в Demo создать поток во время выполнения этого заявления

t = new Thread(this,threadName); 

Есть 5 потоков в этом коде?

Три резьбы приложения (основной, DEMO1 и DEMO2) создаются отдельно от четырех системных нитей (Reference Handler,Signal Dispatcher,Attach Listener,Finalizer).

Thread.sleep (1000), кажется, останавливает все потоки.

Нет. Он останавливает поток, для которого вызывается этот оператор. В вашем случае это может быть DEMO1 или DEMO2.

Если я вызываю синхронизированный метод this() в классе Demo, Demo1 имеет свой монитор одновременно, Demo2 владеет своим монитором, выполняя свою собственную задачу одновременно? Или потому, что они разделяют один общий «Основной монитор», они запускаются по одному за раз, ожидая очереди.

Если вы вызвали метод synchron (this) в методе run() внутри класса Demo, монитор был обнаружен на объекте, для которого выполняется метод run(). В этом случае это либо DEMO1, либо DEMO2. Эти два объекта не разделяют блокировку монитора, если вы не измените это значение с помощью классаName =>synchronized(Demo.Class)

Для получения дополнительной информации обратитесь к этой документации page.

делает эти методы синхронизированные имеет два эффекта:

  1. Во-первых, это не возможно для двух вызовов синхронизированных методов на том же объекте чередовать. Когда один поток выполняет синхронизированный метод для объекта, все другие потоки, которые вызывают синхронизированные методы для одного и того же блока объектов (приостанавливают выполнение) до тех пор, пока первый поток не будет выполнен с объектом.
  2. Во-вторых, когда синхронизированный метод завершается, он автоматически устанавливает связь между событиями и последующим вызовом синхронизированного метода для одного и того же объекта. Это гарантирует, что изменения состояния объекта будут видны для всех потоков.
Смежные вопросы