Потоки Java Новый порядок потоков

1
//Class PrintTask sleeps between0-5 seconds
import java.util.Random;
public class PrintTask implements Runnable{
private final int sleeptime;
private final String taskname;
private final static Random generator= new Random();

public PrintTask(String name)
{
    taskname=name;
    sleeptime=generator.nextInt(5000);

}

public void run()
{
    try 
    {
        System.out.printf("%s going to sleep for %d ms.\n", taskname,sleeptime);
        Thread.sleep(sleeptime);

    }
    catch(InterruptedException exception)
    {
        System.out.printf("%s %s\n", taskname,"terminated prematurely due to interruption");
    }
    System.out.printf("%s done sleeping\n",taskname);



}

}


//Creation and start of three threads 
import java.lang.Thread;
public class Threads {

public static void main(String[] args) {
    System.err.println("Creating threads");
    Thread  thread1=new Thread(new PrintTask("task1"));
    Thread  thread2=new Thread(new PrintTask("task2"));
    Thread  thread3=new Thread(new PrintTask("task3"));

    thread1.start();
    thread2.start();
    thread3.start();
    System.err.println("Tasks Started. Main Ends. \n");
}

}

Некоторые результаты

task2 going to sleep for 320 ms.
task1 going to sleep for 3054 ms.
task3 going to sleep for 1821 ms.
task2 done sleeping
task3 done sleeping
task1 done sleeping

task2 going to sleep for 1338 ms.
task3 going to sleep for 2825 ms.
task1 going to sleep for 3461 ms.
task2 done sleeping
task3 done sleeping
task1 done sleeping

Мой вопрос заключается в том, почему сообщение "задание" перейдет в спящий режим на ** ms, не появляется в правильном порядке: (иногда это может появиться в "правильном" порядке)

task1 going to sleep for **** ms.
task2 going to sleep for **** ms.
task3 going to sleep for **** ms.

но, похоже, он появляется в случайном порядке. Я новичок в потоковом, поэтому, пожалуйста, ответьте мне так просто, как только сможете. Спасибо!

  • 1
    В многопоточной программе три не является гарантией выполнения потока. Все потоки имеют одинаковый приоритет, поэтому любой из них может войти в работоспособное состояние.
  • 0
    так что это на самом деле случайное и нет никакого паттерна, связанного со временем сна?
Показать ещё 2 комментария
Теги:
multithreading

2 ответа

1
Лучший ответ

Вы создаете потоки и отправляете их на какой-то планировщик.

Эти потоки запускаются JVM (или операционной системой) без специального заказа.

Обновить:

Как упоминалось в комментариях @Braj, вы можете повлиять на порядок выполнения, установив приоритет потока.

0

Вообще говоря, потоки JVM сопоставляются с некоторыми собственными потоками os, и какой алгоритм планирования используется ОС, будет использоваться для сбора этих потоков для выполнения. И вообще, если все потоки имеют равный приоритет, а они "Runnable" (т.е. в Runnable state, а не заблокированы или ждут чего-то), тогда выбор потока для запуска является некоторым случайным и зависит от операционной системы, на которой он работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню