Как напечатать массив строк с потоками - PullRequest
1 голос
/ 07 августа 2020

У меня есть массив String:

String[] messages = new String[]{"aaaa", "bbbb", "cccc"};

Как мне распечатать каждое его значение отдельными потоками? Каждое значение - это один поток. Количество потоков создается в том же количестве, что и строк в массиве. Спасибо!

Для этого у меня есть только один класс Thread:

class Worker extends Thread{
}

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Перебираем каждый элемент массива и строим Worker из каждого. Класс Worker должен переопределить метод run для печати String.

class Worker extends Thread{
    private String message;
    public Worker(final String message){
       this.message = message;
    }
    @Override
    public void run(){
      System.out.println(message);
    }
}
public class Main {
    public static void main(String[] args){
       String[] messages = new String[]{"aaaa", "bbbb", "cccc"};
       for(final String message: messages){
         new Worker(message).start();
       }
    }
}
1 голос
/ 07 августа 2020

Служба 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() );
        
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...