56

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

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

10 回答 10

107

您正在线程的方法中调用该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();
于 2013-07-20T03:41:55.207 回答
26

你可以这样做:

    Thread t1 = new Thread(new Runnable() {
    public void run()
    {
         // code goes here.
    }});  
    t1.start();
于 2014-03-09T18:24:24.667 回答
13

目标是编写代码在一个地方调用 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()。

于 2014-12-17T22:26:44.763 回答
8

你需要做两件事:

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

IE

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

如果你不这样做start(),什么都不会发生——创建一个线程不会执行它。

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

于 2013-07-20T04:05:30.483 回答
2

如果您想创建更多线程,在上述情况下,您必须在 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();
于 2013-07-20T05:02:42.027 回答
2

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

于 2014-01-29T06:32:09.040 回答
2

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

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

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

于 2019-02-18T08:41:35.347 回答
2

有几种方法可以创建线程

  1. 通过扩展Thread类 >5
  2. 通过实现Runnable接口 -> 5
  3. 通过使用ExecutorService接口 - >=8
于 2019-06-17T07:17:14.273 回答
0

更简单的方法可以是:

new Thread(YourSampleClass).start();    
于 2014-11-20T01:08:13.673 回答
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();
}

}

于 2018-09-27T10:21:44.350 回答