Я только начал 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){}
}
}
@ Шелдон, я пытаюсь использовать темы. В какой-то степени я понимаю потоки и то, как они работают теоретически. Но в случае практичности (в java) я не могу понять это.
В этом случае я предлагаю вам начать с функции простого тестирования без потоков. Если это сработает, вы можете обмотать его нитью.
Я думаю, вы пытаетесь научиться использовать потоки, реализуя функцию, которая вычисляет простые числа за 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) {
}
}
}
Рад, что вы поняли, что я пытался означает! . И ваше решение, кажется, работает нормально, спасибо.
Нет гарантии, что поток заметит запись другого потока в переменную, если вы не объявите ее volatile
. В вашем примере это срабатывает «случайно», благодаря вызову println
.
@Holger Вы правы, но я не знаю, слишком ли сложно объяснять volatile
здесь
Вы имеете в виду, что более полезно опубликовать код, который сломается, как только ОП заменит оператор печати фактическим вычислением?
Я хотел бы, чтобы новички были сбиты с толку новыми понятиями, помимо связанных с вопросами, как можно меньше. Потокобезопасность здесь не при чем, не так ли?
Поскольку OP работает с несколькими потоками, безопасность потоков является точка. Или, говоря другими словами, твой код не работает. Худшим образом, который только можно себе представить. Кажется, что это работает, когда OP выполняет один тест, но не оставляет шанса понять, почему это не работает при попытке решить реальную проблему.
Вы хотите использовать поток, потому что хотите научиться им пользоваться? Или вы думаете, что для этого нужна нить?