Служба Executor вместо расширения Thread
Платформа Executors была добавлена в Java, чтобы избавить программистов приложений от жонглирования потоками. См. учебник .
Получите услугу исполнителя от Executors
.
ExecutorService es = Executors.newCachedThreadPool() ;
Напишите свою задачу как реализацию Runnable
. Обратите внимание, что мы не расширяем Thread
, в отличие от вашего кода.
String[] messages = new String[]{ "aaaa" , "bbbb" , "cccc" } ;
for( String message : messages )
{
es.submit(
() -> { System.out.println( message ) ; }
) ;
}
В приведенном выше коде мы используем лямбда-синтаксис. С таким же успехом можно использовать традиционный синтаксис.
При запуске с использованием пула потоков из более чем одного потока порядок, в котором выполняются задачи, не определен. Например, при запуске вывод может выглядеть так:
aaaa
cccc
bbbb
String[] messages = new String[]{ "aaaa" , "bbbb" , "cccc" } ;
for ( String message : messages )
{
es.submit(
new Runnable()
{
@Override
public void run ( )
{
System.out.println( message );
}
}
);
}
Кстати, списки, как правило, более удобны, чем массивы в Java.
List< String > messages = List.of( "aaaa" , "bbbb" , "cccc" ) ;
for( String message : messages )
{
es.submit(
() -> { System.out.println( message ) ; }
)
}
См. Весь пример этого класса , запущенного на IdeOne. com .
import java.util.*;
import java.lang.*;
import java.io.*;
import java.time.Instant ;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
System.out.println( "Starting. " + Instant.now() );
ExecutorService es = Executors.newCachedThreadPool();
List < String > messages = List.of( "aaaa" , "bbbb" , "cccc" );
for ( String message : messages )
{
es.submit(
( ) -> { System.out.println( message ); }
);
}
System.out.println( "Tasks submitted to executor service. " + Instant.now() );
try
{
Thread.sleep( TimeUnit.SECONDS.toMillis( 3 ) );
}
catch ( InterruptedException e )
{
e.printStackTrace();
}
System.out.println( "Done. " + Instant.now() );
}
}