这段代码工作正常但是如果我在第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");
}
}
答案 0 :(得分:6)
有两种创建线程的方法:
子类Thread
,覆盖run
,然后创建子类的实例
扩展Runnable
并将其交给线程“运行”
您的代码执行#2 - 您实现了Runnable
,因此您必须将其提供给线程以“运行”它。
如果我在第6行使用构造函数
Thread(name)
而不是Thread(this,name)
它不起作用我只是想知道是什么产生了影响?
区别在于:
Thread t= new Thread(this,name);
创建一个新线程,让Runnable
(this
)在启动时运行。
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构造函数的作用有一个简单的(可理解的)误解。有两个构造函数:
Thread(Runnable, String)创建Thread
,将其名称分配给String
,并指定它应运行Runnable
。
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();
}
}
答案 5 :(得分:0)
不同的是 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)