Java - 创建一个新线程

时间:2013-07-20 03:41:06

标签: java multithreading

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

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

10 个答案:

答案 0 :(得分:86)

您正在线程的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();

答案 1 :(得分:16)

你可以这样做:

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

答案 2 :(得分:10)

目标是编写代码以在一个地方调用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()的instance-block。 结果是一个Thread类的新实例,称为join()。

答案 3 :(得分:7)

你需要做两件事:

  • 启动主题
  • 等待线程完成(死亡),然后继续

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

如果您没有start(),则不会发生任何事情 - 创建线程不会执行

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

答案 4 :(得分:2)

如果你想要创建更多的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();

答案 5 :(得分:2)

start()调用 run()方法。这会自动发生。您只需要调用 start()。有关创建和调用线程的完整教程,请参阅我的博客http://preciselyconcise.com/java/concurrency/a_concurrency.php

答案 6 :(得分:1)

有几种创建线程的方法

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

答案 7 :(得分:0)

更简单的方法可以是:

new Thread(YourSampleClass).start();    

答案 8 :(得分:0)

请尝试这个。看看我的解决方案后,您会完全理解。

只有两种方法可以在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();
}

}

答案 9 :(得分:0)

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

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

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