【叶凡网络】对于Java中Thread,Runnable的区别
- 2014-02-21 11:30:59 | 新闻来源:叶凡网络 | 点击量:954
发现Thread类也是Runnabl接口的子类。一种是继承Thread类,java中可有两种方式实现多线程。一种是实现Runnabl接口;Thread类是java.lang包中定义的一个类只要继承了Thread类同时覆写了本类中的run方法就可以实现多线程操作了但是一个类只能继承一个父类,这是此方法的局限。
下面看例子:
packagorg.thread.demo;
classMyThreadextendThread{
privatStringname;
publicMyThreadStringname{
super;
this.nam=name;
}
publicvoidrun{
forinti=0;i<10;i++{
i="+i; System.out.println"线程开始:"+this.name+".
}
}
}
packagorg.thread.demo;
publicclassThreadDemo01{
publicstaticvoidmainString[]arg{
MyThreadmt1=newMyThread"线程a";
MyThreadmt2=newMyThread"线程b";
mt1.run;
mt2.run;
}
}
先第一个对象执行,但是此时结果很有规律。然后第二个对象执行,并没有相互运行。JDK文档中可以发现,一旦调用start方法,则会通过JVM找到run方法。下面启动start方法启动线程:
packagorg.thread.demo;
publicclassThreadDemo01{
publicstaticvoidmainString[]arg{
MyThreadmt1=newMyThread"线程a";
MyThreadmt2=newMyThread"线程b";
mt1.start;
mt2.start;
}
};
这样顺序可以正常完成交互式运行。那么为啥非要使用start;方法启动多线程呢?
src.zip全部的java源程序,JDK装置路径下。通过此代码找到Thread中的start方法的定义,可以发现此方法中使用了privatnativvoidstart0;其中nativ关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(javaNativInterfac
下面看例子:如果用Runnabl就可以实现资源共享。
packagorg.demo.runnable;
classMyThreadimplementRunnable{
privatintticket=10;
publicvoidrun{
forinti=0;i<20;i++{
ifthis.ticket>0{
System.out.println"卖票:ticket"+this.ticket--;
}
}
}
}
packagorg.demo.runnable;
publicclassRunnableTicket{
publicstaticvoidmainString[]arg{
MyThreadmt=newMyThread;
如果用同一 newThreadmt.start;//同一个mt但是Thread中就不可以。
newThreadmt.start;//个实例化对象mt就会出现异常
newThreadmt.start;
}
};
但是一共卖了10张票,虽然现在顺序中有三个线程。也就是说使用Runnabl实现多线程可以达到资源共享目的
Runnabl接口
而是通过Runnabl接口完成。实际开发中一个多线程的操作很少使用Thread类。
publicinterfacRunnable{
publicvoidrun;
}
例子:
packagorg.runnable.demo;
classMyThreadimplementRunnable{
privatStringname;
publicMyThreadStringname{
this.nam=name;
}
publicvoidrun{
forinti=0;i<100;i++{
i="+i; System.out.println"线程开始:"+this.name+".
}
}
};
只有Thread类中才有。此时观察Thread类,但是使用Runnabl定义的子类中没有start方法。有一个构造方法:publicThreadRunnabltarger此构造方法接受Runnabl子类实例,也就是说可以通过Thread类来启动Runnabl实现的多线程。start可以协调系统的资源)
packagorg.runnable.demo;
importorg.runnable.demo.MyThread;
publicclassThreadDemo01{
publicstaticvoidmainString[]arg{
MyThreadmt1=newMyThread"线程a";
MyThreadmt2=newMyThread"线程b";
newThreadmt1.start;
newThreadmt2.start;
}
}
两种实现方式的区别和联系:
因为实现Runnabl接口相比继承Thread类有如下好处:顺序开发中只要是多线程肯定永远以实现Runnabl接口为主。
一个类可以继承多个接口。防止点继承的局限。
适合于资源的共享
通过Thread类完成:以卖票程序为例。
packagorg.demo.dff;
classMyThreadextendThread{
privatintticket=10;
publicvoidrun{
forinti=0;i<20;i++{
ifthis.ticket>0{
System.out.println"卖票:ticket"+this.ticket--;
}
}
}
};
同时卖票:下面通过三个线程对象。
packagorg.demo.dff;
publicclassThreadTicket{
publicstaticvoidmainString[]arg{
MyThreadmt1=newMyThread;
MyThreadmt2=newMyThread;
MyThreadmt3=newMyThread;
共卖了30张票 mt1.start;//每个线程都各卖了10张。
每个线程都卖自己的票 mt2.start;//但实际只有10张票。
mt3.start;//没有达到资源共享
}
}
Runnabl接口和Thread之间的联系:
publicclassThreadextendObjectimplementRunnable
上一篇:【叶凡网络】西班牙专家制“便便香肠”是从婴儿粪便中提取物质
下一篇:【叶凡网络】执行成果总结会,两岸两会举行协议