java 实现多线程的2种方法有什么区别? 去面试的面试官问我,我也说不清楚具体什么区别,大家怎么看待这个问题呢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没区别,本质上是一样的。但是,java语言只支持单继承,但是可以实现多个接口,因此,实现接口相对来说比较灵活! 这个恶心的问题,主要是性能的问题MyThread myThread = new MyThread();myThread.start();而实现借口呢:MyRunable myRunnable = new myRunnable();MyRunable myRunnable1 = new myRunnable();MyRunable myRunnable2 = new myRunnable();Thread thread = new Thread();thread(myRunnable).start();thread(myRunnable1).start();thread(myRunnable2).start();对于继承的就必须new一个新的Thread实现类,而继承只需要一个就够了另一种说法就是你既然继承了,但是你还要再继承其他的类的话就不可以了 我觉得还有一点就是:继承Thread类的线程实例只能启动一个线程;实现Runnable接口的线程实例可以启动多个线程. 其实主要问题是java 只支持单继承 所以你懂了么? 其实是一种方法:即实现了Thread类的run()方法.只不过一个是通过继承中通过方法覆盖的方式实现,另外一个是Thread类的默认的run()方法实现:如果该线程对象是用实现Runable接口的对象创建的,那么就调用这个Runable接口对象的run()方法 就实质来说,Thread类也是通过实现runnable接口来实现功能的。就应用来说,实现Runnable接口比继承Thread类更优质,很多高人如是说。还有,#5楼的代码是错的,编译都不会通过……#6楼说的有点意思,通过实现Runnable接口的run()方法可以用于多个由它构造的线程实例,而写在Thread子类中的run()方法只能被它自己用。 如果一个类通过继承Thread来实现多线程的话,则不适合多个线程共享资源,而通过实现Runnable就可以做到这一点,下面给lz举个例子:class MyTheard extends Thread{ private int num = 5;//不能声明为静态的全局变量 public void run(){ for(int i=0;i<100;i++){ if(num>0){ System.out.println(Thread.currentThread().getName()+"卖票"+":"+(num--)); } } }}public class TheardDemo01 { public static void main(String[] args) { MyTheard th1 = new MyTheard(); MyTheard th2 = new MyTheard(); MyTheard th3 = new MyTheard(); th1.start(); th2.start(); th3.start(); }}输出结果:Thread-0卖票:5Thread-0卖票:4Thread-0卖票:3Thread-0卖票:2Thread-0卖票:1Thread-2卖票:5Thread-2卖票:4Thread-2卖票:3Thread-2卖票:2Thread-2卖票:1Thread-1卖票:5Thread-1卖票:4Thread-1卖票:3Thread-1卖票:2Thread-1卖票:1class MyThread implements Runnable{ private int num = 5; public void run(){ for(int i = 0;i<100;i++){ if(num>0){ System.out.println(Thread.currentThread().getName()+"卖票:"+" "+(num--)); } } }};public class ThreadDemo02 { public static void main(String[] args) { MyThread mt = new MyThread(); new Thread(mt).start(); new Thread(mt).start(); new Thread(mt).start(); }}输出结果:Thread-1卖票: 5Thread-1卖票: 2Thread-1卖票: 1Thread-0卖票: 4Thread-2卖票: 3总结:通过Rannable接口实现接口有如下的好处:(1)适合于多个相同的程序代码的线程去处理同一资源。(2)可以避免由于单继承带来的局限。(3)增强了程序的健壮性,代码能够被多个线程共享,代码和数据独立。 如果说的是Thread和Runnable的话,我更喜欢Runnable:public class DownloadTask implements Runnable{ private ThreadPool threadPool; public void start(){ if(null != threadPool){ threadPool.execute(this); }else{ new Thread(this).start(); } } public void run(){ //.... } public void setThreadPool(ThreadPool threadPool){ this.threadPool = threadPool; }} 1. 继承Thread--- java只支持单继承,如果继承线程类的话就不能再继承了2. 实现Runnable--- 实现接口可以带来更大的灵活性,改天如果觉得需要另一个类中的方法,那么再继承那个类就行,不影响原来的代码。方法1就不行。2者在功能上是没有区别的 java没有多继承,使用实现Runnable接口方式,可以达到Extends其他类的同时,implements Runnable接口的效果。个人理解,呵呵,其实我也是来看头像的 实现Runnable接口可以解决资源共享的问题。 如果一个类继承了Thread 那么这个类当然不能被多继承 但是Runnable就不一样了 可以实现过个接口,用Runnable解决了单继承的问题,然而Runnable 其实不是线程,只是这个接口中实现了run()方法,当你调用线程的时候 还是要声明Thread对象,启动线程,只是Runnable接口的好处就是不被单继承,资源共享的好处,可以代码重用。 都是通过Thread类的run()方法实现的,只不过一个是通过覆盖这个方法,一个是利用自身默认的调用Runable接口对象的run()方法 多继承单继承的区别嘛,虽说java没有多继承,但加上接口就相当于多继承了 通过实现Runnable接口之后,但是还是需要Thread包装才能启动线程。 一个命令模式的应用而已 你这么说 其实继承Thread 也是实现了 Runnable 接口 首先接口可以避免单继承带来的局限 还有重要的一点是实现Runnable接口可以达到资源共享的目的 比如说四个售票窗口同时卖1000张票 只能有Runnable接口来达到效果 即只有一个对象 就是问继承Thread和实现Runnable接口的区别,可能是小弟我表达不是很到位,欢迎大牛指点一二,纯是请教,呵呵 没有区别,写法不一样而已!实质都是 Thread.start(); 看到一篇文章,也是讨论这个问题的http://software.intel.com/zh-cn/blogs/2011/11/16/java-12/?cid=sw:prccsdn2063 Java只支持单继承,一个类只能继承一个父类,但是一个类可以实现多个借口,借口实现多线程就是弥补JAVA不能实现多继承的不足!!! 我面试时候也问题了,还问我用什么方法启动线程?我说用start方法,他反问我为什么重写的是run方法,启动用start,那时候我蒙了,求解答 说白了run 就是一个对象 而 start是调这个对象的方法 你觉得呢? 我觉得不是呢,重写的run因为是接口的限制,同时run是个回调函数,start是个“通知”的消息,回调的好处是给了线程的时间准备,就是当XX完成的时候,doXX,当线程对象准备完毕的时候调用run,start仅仅是告诉线程对象的一个通知,个人理解。 Java 中不能实现什么多线程。只能给线程创建执行的任务。 Thread类包装方法多,但不灵活,runnable接口,灵活,通常这个二个都是结合起来使用的, 一个是extends Thread类,JAVA只能支持单继承,就是说,一个类只能继承自一个父类,但是,如果使用implements实现Runnable接口,就相当于实现了多重继承,更加的灵活。实际开发中,只要能用第二种,就尽量不用第一种。然后,还有一个小问题就是,实现Runnable接口,他里面只有一个Run()方法,你必须new Thread(实现接口的类的实例化对象).start();这样才能调用run()方法。接口中没有start()方法。应该就这些了。我能想到的。呵呵。 多线程是Java内部的一种机制(不是你创建的),但它执行的任务是你创建的。目前它的任务基本有两种方式创建:1、实现Runnable2、继承Thread 个人感觉,线程启动需要调用系统资源,而run方法是纯调用业务逻辑,从源码也可以看出,start方法调用jni的start0方法,去准备好系统资源,再执行run方法 紧急求救: java 如何读取MP3比特率 、时间长度等信息 急, swing 中如何判断某个组件是否被选中 请问大家,UTF-8如何转换成汉字 求救!急(在线等) 如何将从JTextField中得到的字符串写到数据库中的日期型列里 奇怪的错误~~~~~~~~~~~~~~~~` 关于容器的 synchronized放在哪里? 大家觉得sun的netbeans3.5怎么样? 有没有JB5的学习教材 什么时候才把class打包成mainfest!!!(急),并直接执行 求高手解答 使用jacob在Word中添加水印
MyThread myThread = new MyThread();
myThread.start();
而实现借口呢:
MyRunable myRunnable = new myRunnable();
MyRunable myRunnable1 = new myRunnable();
MyRunable myRunnable2 = new myRunnable();
Thread thread = new Thread();
thread(myRunnable).start();
thread(myRunnable1).start();
thread(myRunnable2).start();
对于继承的就必须new一个新的Thread实现类,而继承只需要一个就够了
另一种说法就是你既然继承了,但是你还要再继承其他的类的话就不可以了
实现Runnable接口的线程实例可以启动多个线程.
就应用来说,实现Runnable接口比继承Thread类更优质,很多高人如是说。
还有,#5楼的代码是错的,编译都不会通过……
#6楼说的有点意思,通过实现Runnable接口的run()方法可以用于多个由它构造的线程实例,而写在Thread子类中的run()方法只能被它自己用。
private int num = 5;//不能声明为静态的全局变量
public void run(){
for(int i=0;i<100;i++){
if(num>0){
System.out.println(Thread.currentThread().getName()+"卖票"+":"+(num--));
}
}
}
}public class TheardDemo01 {
public static void main(String[] args) {
MyTheard th1 = new MyTheard();
MyTheard th2 = new MyTheard();
MyTheard th3 = new MyTheard();
th1.start();
th2.start();
th3.start();
}}
输出结果:
Thread-0卖票:5
Thread-0卖票:4
Thread-0卖票:3
Thread-0卖票:2
Thread-0卖票:1
Thread-2卖票:5
Thread-2卖票:4
Thread-2卖票:3
Thread-2卖票:2
Thread-2卖票:1
Thread-1卖票:5
Thread-1卖票:4
Thread-1卖票:3
Thread-1卖票:2
Thread-1卖票:1class MyThread implements Runnable
{
private int num = 5;
public void run(){
for(int i = 0;i<100;i++){
if(num>0){
System.out.println(Thread.currentThread().getName()+"卖票:"+" "+(num--));
}
}
}
};public class ThreadDemo02
{
public static void main(String[] args)
{
MyThread mt = new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
输出结果:
Thread-1卖票: 5
Thread-1卖票: 2
Thread-1卖票: 1
Thread-0卖票: 4
Thread-2卖票: 3
总结:
通过Rannable接口实现接口有如下的好处:
(1)适合于多个相同的程序代码的线程去处理同一资源。
(2)可以避免由于单继承带来的局限。
(3)增强了程序的健壮性,代码能够被多个线程共享,代码和数据独立。
private ThreadPool threadPool;
public void start(){
if(null != threadPool){
threadPool.execute(this);
}else{
new Thread(this).start();
}
} public void run(){
//....
}
public void setThreadPool(ThreadPool threadPool){
this.threadPool = threadPool;
}
}
个人理解,呵呵,其实我也是来看头像的
写法不一样而已!
实质都是
Thread.start();
借口实现多线程就是弥补JAVA不能实现多继承的不足!!!
然后,还有一个小问题就是,实现Runnable接口,他里面只有一个Run()方法,你必须new Thread(实现接口的类的实例化对象).start();这样才能调用run()方法。接口中没有start()方法。
应该就这些了。我能想到的。呵呵。
1、实现Runnable
2、继承Thread