黑马程序员技术交流社区
标题:
实现多线程有两种方法
[打印本页]
作者:
李节起
时间:
2012-4-9 11:31
标题:
实现多线程有两种方法
实现多线程有两种方法:
分别是通过Thread类的子类来实现和通过实现Runnable接口来实现。
:time:
他们之间有什么区别呢 ?
什么情况需要用通过Thread类的子类来实现,什么情况需要需要通过实现Runnable接口来实现?
作者:
周洋
时间:
2012-4-9 11:50
java实现多线程有两种方法:
一种是继承Thread类
如下面例子:
public class TestThread extends Thread {
//实现多线程方法一:继承Thread类,并重载run方法
public void run(){
//要将一段代码在一个新的线程上运行,该代码应写在run函数中
while(true){
System.out.println(Thread.currentThread().getName() + "is running...");
}
}
}
public class ThreadDemo2 {
public static void main(String[] args) {
//启动一个新的线程,不是直接调用Thread类子类对象的run方法,
//而是调用Thread类子类对象的start方法,Thread类对象的start方法
//将产生新的线程,并在该线程上运行该Thread类对象中的run方法,根据
//多态性 实际上运行的是Thread子类的run方法
TestThread testThread = new TestThread();
testThread.start();
while(true){
System.out.println("main thread is running...");
}
}
}
方法二是:实现接口Runnable中的run函数
如下列所示
//实现多线程方法二:实现Runnable接口,重载run函数,
//大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,
//那么应使用 Runnable 接口。这很重要,
//因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。
public class TestThread implements Runnable {
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName() + "is running......");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestThread testThread = new TestThread();//创建TestThread类的一个实例
Thread thread = new Thread(testThread);//创建一个Thread类的实例
thread.start();//使线程进入runnable状态
while(true){
System.out.println("main thread is running...");
}
}
这两种方法的区别:实现Runnable接口适合多个相同的程序代码访问处理同一资源
作者:
邓海涛
时间:
2012-4-9 11:50
实现Runnable接口相对于继承Thread类来说,有如下的显著优势:
1.适合多个相同代码的线程去处理同一个资源的情况
2.可以避免由于java的单继承特性带来的局限
3.增强了程序的健壮性,代码能够被多个线程共享,代码与数据时独立的
给你个例子,你自己取运行就知道了,好好对比下
class MyThread extends Thread{ // 继承Thread类,作为线程的实现类
private int ticket = 5 ; // 表示一共有5张票
public void run(){ // 覆写run()方法,作为线程 的操作主体
for(int i=0;i<100;i++){
if(this.ticket>0){
System.out.println("卖票:ticket = " + ticket--) ;
}
}
}
};
public class ThreadDemo0{
public static void main(String args[]){
MyThread mt1 = new MyThread() ; // 实例化对象
MyThread mt2 = new MyThread() ; // 实例化对象
MyThread mt3 = new MyThread() ; // 实例化对象
mt1.run() ; // 调用线程主体
mt2.run() ; // 调用线程主体
mt3.run() ; // 调用线程主体
}
};
class MyThread implements Runnable{ // 继承Thread类,作为线程的实现类
private int ticket = 5 ; // 表示一共有5张票
public void run(){ // 覆写run()方法,作为线程 的操作主体
for(int i=0;i<100;i++){
if(this.ticket>0){
System.out.println("卖票:ticket = " + ticket--) ;
}
}
}
};
public class RunnableDemo0{
public static void main(String args[]){
MyThread mt = new MyThread() ; // 实例化对象
new Thread(mt).run() ; // 调用线程主体
new Thread(mt).run() ; // 调用线程主体
new Thread(mt).run() ; // 调用线程主体
}
};
作者:
邓海涛
时间:
2012-4-9 11:52
两个的运行结果是全然不同了,你看了例子你就理解实现Runnable接口相对于继承Thread类的优势了!
作者:
郑涛
时间:
2012-4-9 11:55
这两种方法的区别:
1.继承Thread来创建线程类的方法,在继承了Thread后,不能再继承其他类,这样灵活性就不如实现Runnable接口来创建线程类的方法了。
2.正如上面所说的使用实现Runnable接口来创建线程类的方法可以达到资源共享。(在这里说明一下:继承Thread类来创建线程类的方法也可以实现资源共享,只不过比较麻烦。因此,在创建线程类的时候,应优先选择实现Runnable接口来创建线程类的方法。)
作者:
李柯
时间:
2012-4-9 11:58
实现多线程有两种方法,一是继承Thread类,二是实现Runnable接口。
Thread类创建线程时,首先要定义一个Thread类的子类,并在该子类中重写run()方法。
run()方法是线程体,说明该线程的具体操作。需要创建线程时,
只需创建该子类的对象再调用其start()方法。
实现Runnable接口创建线程必须重写该接口的run()方法。
区别:实现Runnable接口适合多个相同的程序代码访问处理同一资源
而继承Thread类,并重载run方法不能达到此目的。
作者:
陈扬
时间:
2012-4-9 12:11
简单的来说,就是继承和实现接口的区别。
1、当使用继承的时候,主要是为了不必重新开发,并且在不必了解实现细节的情况下拥有了父类我所需要的特征。它也有一个很大的缺点,那就是如果我们的类已经从一个类继承(如小程序必须继承自 Applet 类),则无法再继承 Thread 类,
2、java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了,在其他的方面,两者之间并没什么太大的区别。
3、implement Runnable是面向接口,扩展性等方面比extends Thread好。
4、使用 Runnable 接口来实现多线程使得我们能够在一个类中包容所有的代码,有利于封装,它的缺点在于,我们只能使用一套代码,若想创建多个线程并使各个线程执行不同的代码,则仍必须额外创建类,如果这样的话,在大多数情况下也许还不如直接用多个类分别继承 Thread 来得紧凑。
作者:
pray
时间:
2014-4-26 07:40
在遇到你之前,我对人世间是否有真正的圣人是怀疑的;而现在,我终于相信了!我曾经忘情于汉廷的歌赋,我曾经惊讶于李杜的诗才,我曾经流连于宋元的词曲;但现在,我才知道我有多么浅薄!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2