java 实现多线程的2种方法有什么区别?
去面试的面试官问我,我也说不清楚具体什么区别,大家怎么看待这个问题呢 --------------------编程问答-------------------- 没区别,本质上是一样的。但是,java语言只支持单继承,但是可以实现多个接口,因此,实现接口相对来说比较灵活! --------------------编程问答-------------------- 实现多线程? 你确定没说错? --------------------编程问答-------------------- 我是来看LZ头像的! --------------------编程问答-------------------- 两种多态方式,一个是继承类。 一个是实现接口 --------------------编程问答-------------------- 这个恶心的问题,主要是性能的问题
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卖票: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卖票:1
class 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)增强了程序的健壮性,代码能够被多个线程共享,代码和数据独立。
--------------------编程问答-------------------- 没错的,相信你的眼睛 --------------------编程问答-------------------- 想看你就看,just doit --------------------编程问答-------------------- 小弟就是喜欢你这样用数据说话的大牛,顶 --------------------编程问答-------------------- 如果说的是Thread和Runnable的话,我更喜欢Runnable:
--------------------编程问答-------------------- 继承没有接口实现的多 --------------------编程问答-------------------- 1. 继承Thread--- java只支持单继承,如果继承线程类的话就不能再继承了
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;
}
}
2. 实现Runnable--- 实现接口可以带来更大的灵活性,改天如果觉得需要另一个类中的方法,那么再继承那个类就行,不影响原来的代码。方法1就不行。
2者在功能上是没有区别的 --------------------编程问答-------------------- java没有多继承,使用实现Runnable接口方式,可以达到Extends其他类的同时,implements Runnable接口的效果。
个人理解,呵呵,其实我也是来看头像的。。。 --------------------编程问答-------------------- 头像\(^o^)/~好看不? --------------------编程问答-------------------- 实现Runnable接口可以解决资源共享的问题。 --------------------编程问答-------------------- 顶下12楼的 ,12楼的已经把区别说清楚了! --------------------编程问答-------------------- 希望社区里全部都是像12的牛人, 拿代码解释。 还那么详细... --------------------编程问答-------------------- 如果一个类继承了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 --------------------编程问答-------------------- 每天回帖有十分。。。 --------------------编程问答--------------------
多核处理器就运行不出12的结果。 还是需要点限制的。 --------------------编程问答-------------------- 12楼碉堡 --------------------编程问答-------------------- Java只支持单继承,一个类只能继承一个父类,但是一个类可以实现多个借口,
借口实现多线程就是弥补JAVA不能实现多继承的不足!!! --------------------编程问答-------------------- 我面试时候也问题了,还问我用什么方法启动线程?我说用start方法,他反问我为什么重写的是run方法,启动用start,那时候我蒙了,求解答 --------------------编程问答--------------------
头像挺好看的,不过lz怎么还没结贴呢 --------------------编程问答-------------------- 喜欢吗?那是我媳妇啊,哈哈,易做图呢 --------------------编程问答-------------------- 记住这个例子 很能说明问题 也很经典
--------------------编程问答-------------------- 说白了run 就是一个对象 而 start是调这个对象的方法 你觉得呢? --------------------编程问答-------------------- 我觉得不是呢,重写的run因为是接口的限制,同时run是个回调函数,start是个“通知”的消息,回调的好处是给了线程的时间准备,就是当XX完成的时候,doXX,当线程对象准备完毕的时候调用run,start仅仅是告诉线程对象的一个通知,个人理解。 --------------------编程问答-------------------- 我 觉得楼主 头像 比问题更火....
回头 我也整个 美女头像!谁让干咱们这行 女生那么少呢!
--------------------编程问答--------------------
++++ --------------------编程问答-------------------- 回帖内容很是丰富 收藏.. --------------------编程问答-------------------- 强帖啊!!
--------------------编程问答-------------------- Java 中不能实现什么多线程。只能给线程创建执行的任务。 --------------------编程问答-------------------- Thread类包装方法多,但不灵活,runnable接口,灵活,通常这个二个都是结合起来使用的, --------------------编程问答-------------------- Runable更加面向对象 --------------------编程问答-------------------- hi,大牛你好,你的意思我不是很明白呢.可以说的详细一点或是换个说法不? --------------------编程问答-------------------- 一个是extends Thread类,JAVA只能支持单继承,就是说,一个类只能继承自一个父类,但是,如果使用implements实现Runnable接口,就相当于实现了多重继承,更加的灵活。实际开发中,只要能用第二种,就尽量不用第一种。
然后,还有一个小问题就是,实现Runnable接口,他里面只有一个Run()方法,你必须new Thread(实现接口的类的实例化对象).start();这样才能调用run()方法。接口中没有start()方法。
应该就这些了。我能想到的。呵呵。 --------------------编程问答--------------------
期待你接下来的解析~~ --------------------编程问答-------------------- 找知识了 --------------------编程问答--------------------
多线程是Java内部的一种机制(不是你创建的),但它执行的任务是你创建的。目前它的任务基本有两种方式创建:
1、实现Runnable
2、继承Thread --------------------编程问答--------------------
个人感觉,线程启动需要调用系统资源,而run方法是纯调用业务逻辑,从源码也可以看出,start方法调用jni的start0方法,去准备好系统资源,再执行run方法
补充:Java , Java SE