Подтвердить что ты не робот

Java - создание нового потока

Я новичок в потоках. Я хотел создать некоторую простую функцию, работающую отдельно от основного потока. Но, похоже, это не работает. Я просто хотел бы создать новую тему и сделать что-то там независимо от того, что происходит на главной теме. Этот код может выглядеть странно, но до сих пор у меня не так много опыта с потоками. Не могли бы вы объяснить мне, что с этим не так?

  public static void main(String args[]){
      test z=new test();

      z.setBackground(Color.white);

      frame=new JFrame();
      frame.setSize(500,500);
      frame.add(z);
      frame.addKeyListener(z);
      frame.setVisible(true);

      one=new Thread(){
          public void run() {
              one.start();
              try{
                  System.out.println("Does it work?");
                  Thread.sleep(1000);
                  System.out.println("Nope, it doesnt...again.");
              } catch(InterruptedException v){System.out.println(v);}
          }
      };
  }
4b9b3361

Ответ 1

Вы вызываете метод one.start() в методе run вашего потока. Но метод run вызывается только тогда, когда поток уже запущен. Сделайте это вместо:

one = new Thread() {
    public void run() {
        try {
            System.out.println("Does it work?");

            Thread.sleep(1000);

            System.out.println("Nope, it doesnt...again.");
        } catch(InterruptedException v) {
            System.out.println(v);
        }
    }  
};

one.start();

Ответ 2

Вы можете сделать так:

    Thread t1 = new Thread(new Runnable() {
    public void run()
    {
         // code goes here.
    }});  
    t1.start();

Ответ 3

Цель заключалась в том, чтобы написать код для вызова start() и join() в одном месте. Анонимный класс параметров - анонимная функция. new Thread(() ->{})

new Thread(() ->{
        System.out.println("Does it work?");
        Thread.sleep(1000);
        System.out.println("Nope, it doesnt...again.");       
}){{start();}}.join();

В теле анонимного класса есть экземпляр-блок, который вызывает start(). Результатом является новый экземпляр класса Thread, который называется join().

Ответ 4

Вам нужно сделать две вещи:

  • Запустить поток
  • Подождите, пока нить закончит (умереть), прежде чем продолжить

т

one.start();
one.join();

Если вы не start(), ничего не произойдет - создание Thread не выполняет его.

Если вы не join), ваш основной поток может завершиться и выйти, а весь выход программы до того, как запланирован другой поток. Он неопределен, независимо от того, работает он или нет, если вы не присоединяетесь к нему. Новый поток, как правило, запускается, но иногда может не выполняться. Лучше быть уверенным.

Ответ 5

Если вы хотите создать больше Thread, в этом случае вам придется повторить код внутри метода run или, по крайней мере, повторить вызов некоторого метода внутри.

Попробуйте это, что поможет вам позвонить столько раз, сколько вам нужно. Это будет полезно, когда вам нужно выполнить свой запуск более одного раза и со многих мест.

class A extends Thread {
    public void run() {
             //Code you want to get executed seperately then main thread.       
    }
     }

Основной класс

A obj1 = new A();
obj1.start();

A obj2 = new A();
obj2.start();

Ответ 6

run() метод вызывается start(). Это происходит автоматически. Вам просто нужно позвонить start(). Полный учебник по созданию и вызову потоков см. В моем блоге http://preciselyconcise.com/java/concurrency/a_concurrency.php

Ответ 7

Есть несколько способов создать тему

  1. расширяя класс Thread > 5
  2. путем реализации интерфейса Runnable → 5
  3. используя интерфейс ExecutorService → = 8

Ответ 8

Простейшим способом может быть:

new Thread(YourSampleClass).start();    

Ответ 9

Пожалуйста, попробуйте это. Вы все прекрасно поймете после того, как посмотрите на мое решение.

Есть только 2 способа создания потоков в Java

с орудиями Runnable

class One implements Runnable {
@Override
public void run() {
    System.out.println("Running thread 1 ... ");
}

с удлиненной нитью

class Two extends Thread {
@Override
public void run() {
    System.out.println("Running thread 2 ... ");
}

Ваш ГЛАВНЫЙ класс здесь

public class ExampleMain {
public static void main(String[] args) {

    One demo1 = new One();
    Thread t1 = new Thread(demo1);
    t1.start();

    Two demo2 = new Two();
    Thread t2 = new Thread(demo2);
    t2.start();
}

}

Ответ 10

Поскольку новый вопрос только что был закрыт против этого: вы не должны создавать объекты Thread самостоятельно. Вот еще один способ сделать это:

public void method() {
    Executors.newSingleThreadExecutor().submit(() -> {
        // yourCode
    });
}

Возможно, вам следует сохранить службу executor между вызовами.