【问题标题】:Java - creating a new threadJava - 创建一个新线程
【发布时间】:2013-07-19 11:11:44
【问题描述】:

我是线程新手。我想创建一些与主线程分开工作的简单函数。但这似乎不起作用。我只想创建新线程并在那里独立于主线程上发生的事情做一些事情。这段代码可能看起来很奇怪,但到目前为止我对线程没有太多经验。你能解释一下这有什么问题吗?

  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);}
          }
      };
  }

【问题讨论】:

标签: java multithreading


【解决方案1】:

您正在线程的run 方法中调用one.start() 方法。但是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()。

      【讨论】:

      • 欢迎来到 Stackoverflow。通常,包含解释的答案会更好地被接受。谢谢!
      • 是的,这里的解释不会阻止)目标是写代码来调用start()join() 在一个地方。参数匿名类是一个匿名函数。在匿名类的主体中有调用 start() 的实例块。结果是类 Thread 的一个新实例,称为 join()。
      • 最好通过编辑将您的解释添加到实际答案中
      【解决方案4】:

      你需要做两件事:

      • 启动线程
      • 在继续之前等待线程完成(死)

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

      如果你不start() 它,什么都不会发生 - 创建线程不会执行它。

      如果您不join) 它,您的主线程可能会完成并退出,整个程序退出之前另一个线程已被安排执行。如果你不加入它,它是否运行是不确定的。新线程通常可能会运行,但有时可能不会运行。最好确定一点。

      【讨论】:

      • 启动一个线程并立即加入它是例外而不是规则。如果我们总是这样做,我们将永远不会同时运行两个以上的线程,其中一个将在join() 中等待。如果你的意思更像是“在代码中需要它完成工作的地方加入线程”,那么我会同意这个建议。
      • @Rob 你通常不会加入一个线程,但在这种情况下,他从他的main() 调用它,然后(似乎)什么都不做,所以它很可能会“立即”退出,并且当主线程退出时,JVM 关闭 - 所有(非守护程序)线程都被杀死,尚未执行的线程将永远不会执行。由于情况特殊,只推荐join()
      【解决方案5】:

      如果你想创建更多线程,在上述情况下,你必须在 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】:

          由于一个新问题刚刚结束:您不应该自己创建 Thread 对象。这是另一种方法:

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

          您可能应该在调用之间保留执行程序服务。

          【讨论】:

            【解决方案8】:

            创建线程有几种方法

            1. 通过扩展Thread类>5
            2. 通过实现Runnable接口-> 5
            3. 通过使用 ExecutorService 接口 - >=8

            【讨论】:

            • >5- > 5- >=8 是什么? (ps:仅仅实现Runnable还没有创建线程。实际上Runnable只是一个描述run()方法的接口,它也可以在当前线程上以阻塞方式执行。)
            • 自 # 起在 java 版本中可用
            【解决方案9】:

            更简单的方法是:

            new Thread(YourSampleClass).start();    
            

            【讨论】:

              【解决方案10】:

              请试试这个。看完我的解决方案你就明白了。

              java中创建线程只有两种方式

              带有可运行的工具

              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();
              }
              

              }

              【讨论】:

              • demo2 实际上在做什么,很像new Thread(new Thread()),这很愚蠢。 --> 你可能想这样做:Thread t2 = new Two();
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-10-07
              • 1970-01-01
              • 2020-04-07
              • 2020-01-01
              相关资源
              最近更新 更多