繁体   English   中英

使用Runnable和Thread创建线程的区别?

[英]Difference in creation of thread using Runnable and Thread?

这段代码工作正常,但是如果我在第6行中使用构造函数Thread(name)而不是Thread(this,name),则它无法正常工作,我只是想知道有什么区别?

public class threadtest implements Runnable{
    Thread t;

    public threadtest(String name)
    {
        System.out.println("satheesh");
        Thread t=new Thread(this,name);
        t.start();
        t=null;
        //System.out.println(this+"\n"+t);
    }

    public void run(){
        System.out.println("satheesh");
        for(int i=0;i<=10;i++)
        {
            try{
                System.out.println("satheesh");
                Thread.sleep(1000);
                System.out.print(Thread.currentThread());
            }
            catch(Exception e)
            {
                System.out.println(e);
            }
        }
    }

    public static void main(String args[])
    {
        threadtest ob=new threadtest("satheesh");       
    }
}

有两种创建线程的方法:

  1. 子类Thread ,重写run ,然后创建您的子类的实例

  2. 扩展Runnable并将其提供给线程以“运行”它

您的代码执行#2-实现了Runnable ,因此必须将其提供给线程以“运行”它。

如果我在第6行中使用构造函数Thread(name)而不是Thread(this,name) ,则它不起作用,我只是想知道有什么区别?

区别在于:

  • Thread t= new Thread(this,name);

    创建一个新线程,让您的Runnablethis )在启动时运行。

  • Thread t= new Thread(name);

    创建一个新线程没有任何Runnable来运行。 因此,线程在启动时不执行任何操作。

编写new Thread("somename")会创建一个不会执行任何操作的线程。
(因为您从未提供运行所需的任何内容)

我们使用runnable接口创建线程,如果我们使用runnable接口,则在线程构造函数中,我们传递runnable对象引用和线程名称。当您使用thread(name)时,它不称为start(),但是当您创建thread(this时,名称),它满足了可运行线程的需求并启动了start()。

对于不同的Thread构造函数有一个简单的(可以理解的)误解。 有两个有问题的构造函数:

  1. Thread(Runnable,String)创建一个Thread ,将其名称分配给String并指定它应运行Runnable

  2. Thread(String)使用Thread的特殊魔术参数(null,null,name)调用常规构造函数。 这将创建一个新的Thread ,但它会在运行的方法Thread ,没有提供任何Runnable 结果,如果您调用t.start() ,它将调用线程的run()方法。

因此,简单地重写代码即可获得所需的内容:

public class threadtest extends Thread { // [sic] on the capitalization

    public threadtest(String name) {
        System.out.println("satheesh");
    }

    public void run() {
        System.out.println("satheesh");
        for(int i=0;i<=10;i++) {
        try {
            System.out.println("satheesh");
            Thread.sleep(1000);
            System.out.print(Thread.currentThread());
        } catch(Exception e) {
            System.out.println(e);
        }
    }

    public static void main(String args[]) {
        threadtest ob = new threadtest("satheesh");
        // The following will call the correct run method now
        ob.start();
    }

}

首先,我们应该知道Thread(String s)与Thread(Runnable r,String s)的不同用途。

区别在于Thread(String s) 我们将括号()中的“值”发送给实现Runnable的构造函数,而Thread(Runnable r,String s) 我们将String的线程名称赋予实现Runnable的线程构造函数。

这里是通过线程实现Runnable的相同代码(Runnable r,String s)。

public class threadtest implements Runnable{
Thread t;
threadtest th;

public threadtest(){}

public threadtest(String name)
{
System.out.println("satheesh");
Thread t=new Thread(th, name); //satheesh,name of thread, gave to name
t.start(); //2nd thread that will start run() method in void run()
//t=null;
//System.out.println(this+"\n"+t);
}
public void run(){
 System.out.println("satheesh");
for(int i=0;i<=10;i++)
{
try{
System.out.println("satheesh");
Thread.sleep(1000);
System.out.print(Thread.currentThread());
}
catch(Exception e)  { System.out.println(e); }
}
}
public static void main(String args[]){

//ob is Runnable object that will send his empty value ()
threadtest ob = new threadtest(); //to default constructor threadtest() above

//satheesh is name of main thread that we will send to String name in Thread t=new Thread(th, name);
Thread th = new Thread(ob, "satheesh");
th.start();  //1st thread that will instruct to send satheesh
}
}

输出:

satheesh
satheesh
Thread[satheesh,5,main]satheesh
Thread[satheesh,5,main]satheesh
Thread[satheesh,5,main]satheesh
Thread[satheesh,5,main]satheesh
Thread[satheesh,5,main]satheesh
Thread[satheesh,5,main]satheesh
Thread[satheesh,5,main]satheesh
Thread[satheesh,5,main]satheesh
Thread[satheesh,5,main]satheesh
Thread[satheesh,5,main]satheesh
Thread[satheesh,5,main]satheesh
BUILD SUCCESSFUL (total time: 11 seconds)

您的问题与以下问题相同: “可运行的实现”与“扩展线程”

另一个好的信息来源是coderanch.com http://www.coderanch.com/t/233370/threads/java/Thread-vs-Runnable上的该线程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM