Сколько потоков может выполняться на CPU одновременно

Я хочу знать, сколько потоков можно запустить на CPU для одного приложения одновременно?

Я же простой, как:

import java.awt.SystemColor;
import java.util.Date;

public class Threadcall {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        System.out.println("--------------------------");
        System.out.println(Runtime.getRuntime().availableProcessors());
        System.out.println("--------------------------");
        for (int i = 0; i < 5; i++) {
            new samplethread(i);
        }
        // create a new thread
        //samplethread1.run();
        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("Main Thread: " + i + "t" + new Date());
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("Main thread interrupted.");
        }
        System.out.println("Main thread exiting.");
    }
}

public class samplethread implements Runnable {

    Thread t;

    samplethread(int i) {
        // Create a new, second thread
        t = new Thread(this, Integer.toString(i));
        System.out.println("Child thread Creation NO: " + i + "t" + t.getName());



        t.start(); // Start the thread
        // t.run();

    }

    @Override
    public void run() {

        try {
            for (int i = 5; i > 0; i--) {

                System.out.println("Child Thread Run: " + i + "t" + t.getName() + "t" + new Date());
                // Let the thread sleep for a while.
                System.out.println("****************************");
                Thread.sleep(500);
            }
        } catch (InterruptedException e) {
            System.out.println("Child interrupted.");
        }
        System.out.println("Exiting child thread.");
    }
}

он показывает выход, как:

Номер Процессора: 2

основная нить: 3 ВС 26 мая 19:23: 19 IST 2013

запуск дочерней нити: 1 2 Sun May 26 19:23: 19 IST 2013

запуск дочерней нити: 1 1 Солнце 26 мая 19:23: 19 IST 2013

Запуск Дочерней Нити: 1 3 Sun May 26 19: 23: 19 IST 2013

запуск дочерней нити: 10 ВС 26 мая 19:23: 19 IST 2013

запуск дочерней нити: 1 4 Sun May 26 19:23: 19 IST 2013

из вывода видно, что одновременно могут выполняться пять потоков (я даже печатаю результат в миллисекундах)..........У меня есть два процессора, о которых сообщается в программе.

Как это возможно?

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

есть ли способ показать, что только один поток может работать в одном процессоре одновременно.......

Если я изменю свой код, например:

t.start();
t.join();

затем он показывает выход, как:

создание дочернего потока нет: 99 99 Запуск дочерней нити: 5 99 Sun May 26 21:02: 32 IST 2013

запуск дочерней нити: 4 99 Sun May 26 21:02: 32 IST 2013

бег потока ребенка: 3 99 Солнце Май 26 21:02: 33 Ист

запуск дочерней нити: 2 99 Sun May 26 21:02: 33 IST 2013

запуск дочерней нити: 1 99 Sun May 26 21:02: 34 IST 2013

Итак, как возможно, что если я добавлю простую строку в код, то это покажет, что только два потока могут получить доступ к двум процессорам?

1 ответов


зависит от того, что вы подразумеваете под "одновременно."Вы можете иметь бесконечное количество потоков, выполняемых на одном и том же процессоре через переключение, т. е. выполнение одной строки кода из одного потока, а затем переключение на другой, выполнение одной строки кода, а затем переключение обратно. Процессор имитирует "одновременное выполнение", переключаясь взад и вперед очень быстро.

однако большинство процессоров ограничены по количеству поистине синхронный threads они могут выполнение количеству ядер у них, но даже это плохая оценка из-за общих ресурсов и оборудования. Теоретически у вас может быть до 4 одновременных потоков, работающих на 4-ядерном процессоре.