瞧瞧这两个方法有啥区别呀 new Thread(new Runnable(){ public void run() { System.out.println("你好!"); } }).start(); new Thread(){ public void run() { System.out.println("你好!"); } }.start(); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 线程的两种实现方式,一种是继承thread一种是实现Runnable接口 效果是一样的如果连Runnable都是匿名的,还是第二种简洁一些 jdk上是这么说的“Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。 设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread 类实现了 Runnable。激活的意思是说某个线程已启动并且尚未停止。 此外,Runnable 为非 Thread 子类的类提供了一种激活方式。通过实例化某个 Thread 实例并将自身作为运行目标,就可以运行实现 Runnable 的类而无需创建 Thread 的子类。大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。” 在你这个例子中没什么分别,第一种创建了2个实例,第二种创建一个1实例正式使用就看你的具体需求,Runnable是接口,灵活,因为java只能单继承,如果既想继承某个类又想多线程处理,即实现Runnable,否则两种都可以,Thread本身就是implements Runnable的 这两种方式除了是继承和实现的区别之外,没有其它的任何区别。因为一个类只能继承一个父类,却能实现多个接口(比如你现在有一个类已经有一个父类了,你没有办法继承Thread类了,那就可以实现Runnable接口,来达到相同的效果)。如果在你写的程序中你随便用那个达到的效果应该都是一样的。 public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); } private void init(ThreadGroup g, Runnable target, String name, long stackSize) { ...... this.target = target; ...... } @Override public void run() { if (target != null) { target.run(); } }以上是 Thread 类中的源代码由此可见几乎没有任何区别第二种方法:直接重写 run 方法的话可以少做一个 target != null 的判断可见性能略高的应该是 -- 第二种方法虽然只是高了那么一点点点点点点 线程实现的两种方式不过通常是用实现接口Runnable 来做任务的~ 其实是实现Runnable 接口用的要好些,因为这样可以实现多线程公用一个实现了Runnable的对象class A implements Runnable{ public void run() { }}A a=new A();Thread aa=new Thread(a);aa.start;Thread bb=new Thread(a);bb.start;如果直接继承Thread类是做不到的 直接继承Thread的话,只能单继承成。如果实现Runnable接口的话,可以实现多继承。 如何判断接口方法不被调用?请大侠帮忙 exception in thread "main" java.lang.NoClassDefFoundError:hello/class 递回判断一个字符串是否是回文 #测验基本功:一文件操作问题 我的第一个JAVA程序(hello world)就有问题,郁闷! 如何把tree的左边的小加号和线去掉 请问哪能下JAVA类中的函数库大全呀?????? 几个基本概念问题 请问在java中如何写入word模版文件?(在线等待)谢谢! 关于 JB4 的 JDBC Explorer 的问题。 ResourceBundle问题 求教final的用法
如果连Runnable都是匿名的,还是第二种简洁一些
“Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。 设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread 类实现了 Runnable。激活的意思是说某个线程已启动并且尚未停止。 此外,Runnable 为非 Thread 子类的类提供了一种激活方式。通过实例化某个 Thread 实例并将自身作为运行目标,就可以运行实现 Runnable 的类而无需创建 Thread 的子类。大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。”
正式使用就看你的具体需求,Runnable是接口,灵活,因为java只能单继承,如果既想继承某个类又想多线程处理,即实现Runnable,否则两种都可以,Thread本身就是implements Runnable的
这两种方式除了是继承和实现的区别之外,没有其它的任何区别。
因为一个类只能继承一个父类,却能实现多个接口(比如你现在有一个类已经有一个父类了,你没有办法继承Thread类了,那就可以实现Runnable接口,来达到相同的效果)。
如果在你写的程序中你随便用那个达到的效果应该都是一样的。
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
} private void init(ThreadGroup g, Runnable target, String name,
long stackSize) {
......
this.target = target;
......
} @Override
public void run() {
if (target != null) {
target.run();
}
}
以上是 Thread 类中的源代码
由此可见几乎没有任何区别
第二种方法:直接重写 run 方法的话
可以少做一个 target != null 的判断
可见性能略高的应该是 -- 第二种方法
虽然只是高了那么一点点点点点点
class A implements Runnable{
public void run()
{
}
}
A a=new A();
Thread aa=new Thread(a);
aa.start;
Thread bb=new Thread(a);
bb.start;如果直接继承Thread类是做不到的