Как вычислить как можно больше простых чисел за десять секунд, используя потоки в java

Я только начал java, и я пытаюсь изучить java как можно больше. Я пытался решить проблему, но не мог найти правильное решение. Я пробовал эту программу по собственной логике, закончился неудачей. С нетерпением жду чьего-то руководства.

 public class ThreadDemo implements Runnable
 {
    Thread t;
    ThreadDemo()
        {
        t=new Thread(this,"Child");
        t.start();  
        }
    public void run()
        {
        try 
         {
          Thread.sleep(2000);
        }
        catch (Exception ex){}
        }
    public static void main(String[] args)
     {
        ThreadDemo td=new ThreadDemo();
        Thread t1=Thread.currentThread();
        t1.setName("prime");
          try 
        {
        for(int i=0;;i++)
            {
                 if (i!=0&&i!=1&& i%i ==1 && i%2!=0)
                 {
                     Thread.sleep(1);
                     System.out.println(i + "j");
                 }
             }  
        }
        catch (Exception ex){}
     }
}

Вы хотите использовать поток, потому что хотите научиться им пользоваться? Или вы думаете, что для этого нужна нить?

Sheldon 16.05.2022 22:47

@ Шелдон, я пытаюсь использовать темы. В какой-то степени я понимаю потоки и то, как они работают теоретически. Но в случае практичности (в java) я не могу понять это.

Abdullah 16.05.2022 22:53

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

Sheldon 16.05.2022 23:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы пытаетесь научиться использовать потоки, реализуя функцию, которая вычисляет простые числа за 10 секунд. Другими словами, вы хотите остановить вычисление простого числа через 10 секунд с помощью многопоточности. Таким образом, вы можете установить флаг в основном цикле расчета, чтобы остановить его, а затем в другом потоке изменить его через 10 секунд.

Кстати, ваш способ вычисления простых чисел неверен. Я покажу вам ядро, которое напечатает как можно больше чисел за 10 секунд. Вы можете изменить код для печати простых чисел》

public class ThreadDemo implements Runnable {
    Thread t;
    static boolean flag = true;

    ThreadDemo() {
        t = new Thread(this, "Child");
        t.start();
    }

    public void run() {
        try {
            Thread.sleep(10_000);
            flag = false;
        } catch (Exception ex) {
        }
    }

    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
        Thread t1 = Thread.currentThread();
        t1.setName("prime");

        try {
            for (int i = 0; flag; i++) {
                System.out.println(i);
                Thread.sleep(1);
            }
        } catch (Exception ex) {
        }
    }
}

Рад, что вы поняли, что я пытался означает! . И ваше решение, кажется, работает нормально, спасибо.

Abdullah 17.05.2022 07:15

Нет гарантии, что поток заметит запись другого потока в переменную, если вы не объявите ее volatile. В вашем примере это срабатывает «случайно», благодаря вызову println.

Holger 17.05.2022 11:26

@Holger Вы правы, но я не знаю, слишком ли сложно объяснять volatile здесь

ryoii 17.05.2022 11:30

Вы имеете в виду, что более полезно опубликовать код, который сломается, как только ОП заменит оператор печати фактическим вычислением?

Holger 17.05.2022 11:31

Я хотел бы, чтобы новички были сбиты с толку новыми понятиями, помимо связанных с вопросами, как можно меньше. Потокобезопасность здесь не при чем, не так ли?

ryoii 17.05.2022 11:43

Поскольку OP работает с несколькими потоками, безопасность потоков является точка. Или, говоря другими словами, твой код не работает. Худшим образом, который только можно себе представить. Кажется, что это работает, когда OP выполняет один тест, но не оставляет шанса понять, почему это не работает при попытке решить реальную проблему.

Holger 17.05.2022 19:13

Другие вопросы по теме