在java中使用runnable接口实现线程

在java中使用runnable接口实现线程,java,Java,为什么我们必须创建一个类的实例并将其附加到新创建的thread对象,即使两者都在同一个类中 import java.io.*; class thread1 implements Runnable{ public void run(){ System.out.println("thread started"); } public static void main(String args[]) throws Exception{ Thread t1=n

为什么我们必须创建一个类的实例并将其附加到新创建的thread对象,即使两者都在同一个类中

import java.io.*;
class thread1 implements Runnable{

   public void run(){
       System.out.println("thread started");
   }

   public static void main(String args[]) throws Exception{
      Thread t1=new Thread(new thread1());
      t1.start();
   }
}

在新线程中执行自定义代码不必创建Runnable。也可以直接创建thread的子类

public class WorkerThread extends Thread{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        // DO SOMETHING
    }

}

public class MainClass {
    public static void main(String[] args){
        new WorkerThread().start();

        MainClass mc = new MainClass();
        mc.startThread();
    }

    private void startThread(){
        Thread t = new WorkerThread();
        t.start();
    }
}

有两种方法可以编写线程

public class ThreadX implements Runnable {
    public void run() {
        //Code
    }
}
/* with a "new Thread(new ThreadX()).start()" call */


public class ThreadY extends Thread {
    public ThreadY() {
        super("ThreadY");
    }
    public void run() {
        //Code
    }
}
/* with a "new ThreadY().start()" call */

public class MainClass {
    private Thread threadX = new Thread(new ThreadX());
    private Thread threadY = new ThreadY();

    public static void main(String[] args){
        // Call threads
        threadX.start();
        threadY.start();

        // some more threads
        new Thread(new ThreadX()).start();
        new ThreadY().start();
    }
}

扩展线程时,通常会扩展类以添加或修改功能。因此,如果您不想覆盖任何线程行为,请使用Runnable。

我认为您有两个问题:

1.)如何在Java中使用线程?Fizer Khan的回答就是一个例子

2.)静态方法在java中如何工作?如果你有一个静态的方法,可以说,你是在一个“静态层”上。您没有“this”引用,因为该层上没有对象。只有创建实例时,才能访问此对象上的实例字段和非静态方法。 如果添加第二个静态方法,则可以执行与主方法相同的操作,因为两者都是静态的。这是一个粗略的问题:


是的,因为
main()
static
特性,为什么它应该是static?有关
static
modifier@RC. - 这不是因为
main
的静态特性。这是因为,要启动一个新线程,你必须创建它的实例。@TheLostMind我想他说的是
thread1
好的,没错。但是为什么我们不能在主函数之外创建一个线程实例呢?你可以。这只是一个例子,您可以在任何地方创建和启动新线程。就像实例化任何对象一样,不能使对象仅作为对它的引用而保持静态。您可以使用静态方法。这很好,我的意思是,没有理由不这样做。但我尝试过这样做,但错误是:thread1.java:9:error:expected t1.start()^然后出现语法错误或其他问题,但我在您的示例中没有看到。好的,很抱歉,我提供了在main()中创建和启动线程的代码。但我希望看到一个在main()之外创建和启动线程的程序。你能给我看一个在主函数之外创建和启动线程对象的例子吗?我添加了代码,在主函数之前创建线程实例作为类成员。因为,你可以将对象实例化为类成员。但是您需要一个主函数来调用它。谢谢,这正是我想要的。那么,是否可以使用多个类创建一个全局线程呢。
pulblic class Thread1 implements Runnable{ //name should be upper case

public void run(){
    System.out.println("thread started");
}

public static void main(String args[]) throws Exception{ //static method
   Thread t1=new Thread(new Thread1()); //t1 is a local reference to an object on the heap - no specil magic here
   t1.start(); //call to an "instance" method, can only be performed on an object.
}