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

时间:2011-01-26 15:29:21

标签: java

这段代码工作正常但是如果我在第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");       
    }
}

6 个答案:

答案 0 :(得分:6)

有两种创建线程的方法:

  1. 子类Thread,覆盖run,然后创建子类的实例

  2. 扩展Runnable并将其交给线程“运行”

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

      

    如果我在第6行使用构造函数Thread(name)而不是Thread(this,name)它不起作用我只是想知道是什么产生了影响?

    区别在于:

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

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

    • Thread t= new Thread(name);

      在运行任何Runnable的情况下,创建一个新的线程 。所以线程在启动时什么都不做。

答案 1 :(得分:3)

new Thread("somename")创建一个不会做任何事情的线程 (因为你从来没有为它提供过任何东西)

答案 2 :(得分:0)

您的问题与此问题相同:"implements Runnable" vs. "extends Thread"

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

上的这个主题

答案 3 :(得分:0)

你使用runnable接口创建线程,如果我们使用runnable接口,那么在线程构造函数中我们传递runnable对象的引用和thread的名称。当你使用thread(name)时,它不叫start()但是当你创建线程时(这,名称)它满足runnable线程的要求并启动start()。

答案 4 :(得分:0)

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

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

  2. Thread(String)使用Thread (null, null, name)的特殊魔术参数调用常规构造函数。这会创建一个新的Thread,但会在Thread中运行该方法,而不是任何提供的Runnable。因此,如果您致电t.start(),则会调用线程的run()方法。

  3. 因此,简单地重写代码可以获得您想要的内容:

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

答案 5 :(得分:0)

1,我们应该知道Thread(String s)vs Thread(Runnable r,String s)的目的不同。

不同的是 Thread(String s) 我们在bracket()中向实现Runnable但 Thread(Runnable r,String s)的构造函数发送了“value” 我们给String s一个线程名称给实现Runnable的线程构造函数。

这里通过Thread实现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)