2015-03-09 2 views
2

Я хотел бы понять, что java фактически запускает несколько потоков параллельно в многоядерном процессоре или происходит переключение контекста между потоками, и только один поток активен, а другие ждут своей очереди бежать.Является ли Java фактически параллельным потоком?

Другими словами, существует вероятность того, что 2 потока работают параллельно ???

Поскольку мой Thread.currentThread() не дает мне массив потоков, а работает только один поток. Итак, какова правда, работает только один поток, а другие ждут или несколько потоков могут выполняться параллельно, если да, то почему мой метод Thread.currentThread() возвращает только 1 объект потока.

Edit: .....

Я создал 2 классы для подсчета число 1 класс делает это синхронно и другая делит его на две половинки и выполняет две половинки в 2-х нитей .. (Intel i5 (4 процессоров), 8 ГБ оперативной памяти) код выглядит следующим образом:

общий класс:

class Answer{ 
long ans = 0L;} 

Мульти исполнение Автор: общественный класс Sheet2 {

public static void main(String[] args) { 

    final Answer ans1 = new Answer(); 
    final Answer ans2 = new Answer(); 


    Thread t1 = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      for(int i=0;i<=500000; i++) { 
       ans1.ans = ans1.ans + i; 
      } 
     } 
    }); 

    Thread t2 = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      for(int i=500001;i<=1000000; i++) { 
       ans2.ans = ans2.ans + i; 
      } 
     } 
    }); 
    long l1 = System.currentTimeMillis(); 

    try { 
     t1.start();t2.start(); 
     t1.join(); 
     t2.join(); 
     long l2 = System.currentTimeMillis(); 
     System.out.println("ans :" + (ans1.ans + ans2.ans) +" in "+(l2-l1) +" milliseconds"); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 


} 

}

Одно исполнение резьбы: общественного класса Sheet3 {

public static void main(String[] args) { 

    final Answer ans1 = new Answer(); 

    long l1 = System.currentTimeMillis(); 

    for(int i=0;i<=1000000; i++) { 
     ans1.ans = ans1.ans + i; 
    } 
    long l2 = System.currentTimeMillis(); 

    System.out.println("ans :" + (ans1.ans) +" in "+(l2-l1) +" milliseconds"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 

} 

}

Мой единственный поток выполнения быстрее, чем мой многопоточных исполнения, я, хотя переключение контекста было сначала накладывая накладные расходы на выполнение, и, следовательно, результат многопоточного исполнения был медленнее, теперь у меня есть процессор с несколькими ядрами (4 процессора), но все же однопоточный ex В этом примере ускорение происходит быстрее.

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

Просьба пролить свет на эту тему. Спасибо заранее. Cheers. !!!

+0

любым шансом вы пришли из Python? – vz0

+0

Привет @ vz0, нет Я из java .. !! :) –

ответ

5

Короче говоря, он работает на отдельных потоках. Вы можете протестировать его, создав 100 потоков и проверив в вашем проводнике процессов, что он скажет 100 потоков. Также вы можете сделать некоторые вычисления в каждом потоке, и вы увидите, что ваш многоядерный процессор перейдет на 100%.

Thread.currentThread предоставляет вам текущую нить, из которой вы работаете. Когда вы запускаете свою программу, вы запускаете «основную» нить. Как только вы начинаете новый поток

new Thread(myRunnable);

любой код, расположенный в myRunnable будет работать на новом потоке, пока ваш текущий поток все еще находится на главной Thread.

Если вы посмотрите API http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html, он дает более подробное описание темы.

+0

Спасибо большое. !! да, я исправлю себя здесь. !!! –

2

Да, так оно и есть. Запустите любой простой бесконечный цикл на нескольких потоках, и вы увидите, что использование процессора> 100% на многоядерном процессоре.

+0

, если да, то почему api Thread.currentThread() возвращает только один поток. Является ли это, что он возвращает только ссылку своего потока, а не все потоки, которые выполняются. ???? Я думал, что это переключение контекста, и каждый поток по очереди выполняет операцию ... и передает выполнение другому потоку, когда он выполняет некоторые операции с внешними ресурсами, такими как DB или IO. –

+0

@ArghoChatterjee Он возвращает поток, выполняющий вызов 'Thread.currentThread().' – EJP

+0

Вызов Thread.currentThread() возвращает ссылку на поток, выполняющий вызов функции. Если существует много потоков, выполняющих один и тот же код, каждый вызов возвращает другую ссылку на поток. – vz0

4

Фактический механизм нарезания резьбы может варьироваться в зависимости от архитектуры процессора. Но реальная проблема заключается в том, что вы неправильно интерпретируете имя метода. Thread.currentThread() не возвращает нить, выполняемую в текущий момент времени; он возвращает поток, выполняющий вызов метода, то есть сам.

+0

спасибо за исправление меня здесь .. Да, действительно, поэтому я должен предположить, что в нескольких ядрах, скажем, 16 основных машинах, в PARALLEL внутри одного JVM может быть 2-3 потока и улучшать время отклика. ?. –

+0

@ArghoChatterjee Это разумное предположение. – shmosel

1

Да это запускать потоки одновременно .Это является целью концепции многопоточной .Вы можете найти на следующие дискуссии полезным: Current Thread Method java

0

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

Спецификация языка Java не требует , что потоки выполняются параллельно, но позволяет им сделать это. То, что на самом деле происходит в любой конкретной виртуальной машине Java, зависит от того, как реализована эта JVM.

Любая практическая JVM будет создавать один «родной» (то есть операционная система) поток для каждого потока Java, и пусть операционной системы заботиться о планировании, блокировки, ожидая, уведомляя, ...

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