在java中使用runnable接口实现线程
为什么我们必须创建一个类的实例并将其附加到新创建的thread对象,即使两者都在同一个类中在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
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.
}