A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李玉杰 黑马帝   /  2012-2-9 14:59  /  1793 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lyj749 于 2012-2-9 17:43 编辑

为什么实现Runable接口就可以开启多线程?那开启线程的代码到底存放在哪里呢?

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

4 个回复

正序浏览
Thread类也实现了Runable借口,开启一个线程用start方法,线程要执行的代码存放在run方法中,因此要复写run方法
回复 使用道具 举报
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。Thread类的构造方法被重载了八次,构造方法如下:
public Thread( );
public Thread(Runnable target);  
public Thread(String name);  
public Thread(Runnable target, String name);  
public Thread(ThreadGroup group, Runnable target);  
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);
  Runnable target
  实现了Runnable接口的类的实例。要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。
  String name
  线程的名子。这个名子可以在建立Thread实例后通过Thread类的setName方法设置。如果不设置线程的名子,线程就使用默认的线程名:Thread-N,N是线程建立的顺序,是一个不重复的正整数。
  ThreadGroup group
  当前建立的线程所属的线程组。如果不指定线程组,所有的线程都被加到一个默认的线程组中。关于线程组的细节将在后面的章节详细讨论。
  long stackSize
  线程栈的大小,这个值一般是CPU页面的整数倍。如x86的页面大小是4KB.在x86平台下,默认的线程栈大小是12KB.
  一个普通的Java类只要从Thread类继承,就可以成为一个线程类。并可通过Thread类的start方法来执行线程代码。虽然Thread类的子类可以直接实例化,但在子类中必须要覆盖Thread类的run方法才能真正运行线程的代码。下面的代码给出了一个使用Thread类建立线程的例子:
 package mythread;   
  
 public class Thread1 extends Thread  
 {   
 public void run()  
{  
 System.out.println(this.getName());  
 }  
 public static void main(String[] args)
 {  
 System.out.println(Thread.currentThread().getName());
  Thread1 thread1 = new Thread1();  
 Thread1 thread2 = new Thread1 ();  
 thread1.start();  
 thread2.start();  
  }  
 }
  上面的代码建立了两个线程:thread1和thread2.上述代码中的005至008行是Thread1类的run方法。当在014和015行调用start方法时,系统会自动调用run方法。在007行使用this.getName()输出了当前线程的名字,由于在建立线程时并未指定线程名,因此,所输出的线程名是系统的默认值,也就是Thread-n的形式。在011行输出了主线程的线程名。
  上面代码的运行结果如下:
      main   Thread-0   Thread-1
  从上面的输出结果可以看出,第一行输出的main是主线程的名子。后面的Thread-1和Thread-2分别是thread1和thread2的输出结果。
  注意:任何一个Java程序都必须有一个主线程。一般这个主线程的名子为main.只有在程序中建立另外的线程,才能算是真正的多线程程序。也就是说,多线程程序必须拥有一个以上的线程。
Thread类有一个重载构造方法可以设置线程名。除了使用构造方法在建立线程时设置线程名,还可以使用Thread类的setName方法修改线程名。要想通过Thread类的构造方法来设置线程名,必须在Thread的子类中使用Thread类的public Thread(String name)构造方法,因此,必须在Thread的子类中也添加一个用于传入线程名的构造方法。 

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
问题1. 为什么实现Runable接口就可以开启多线程?
答:开启多线程有2种方式。不仅仅只有实现Runnable接口;还有继承Thread类。
     实现方式:Runnable接口对象可以作为参数构造多个线程。new Thread(runnable);...new多个,创建多线程。
     继承方式:直接创建new多个Thread()子类对象即可。

问题2. 那开启线程的代码到底存放在哪里呢?
答:一般开启线程的代码放在主线程main方法内。

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
创建线程有两种方法:


一,线程创建的第一种方式:
1,        声明一个Thread的子类。
2,        覆盖Thread父类中的run()方法,并将线程要执行的内容写在run()方法中。
3,        创建子类线程对象
4,        启动子类线程对象的start() 方法。(告诉jvm启动线程,并执行子类中的run方法)




二,线程第二种创建方式:(线程多用次方法)
1,实现Runable 接口,并覆盖run方法,将线程执行内容写进run方法中。
2,创建子类对象。
3,用Thread线程类创建线程对象,并将实现接口的子类对象作为实际参数传递给Thread类的构造方法。
(原因:因为线程执行的任务都封装在了Runable接口的子类中,必须将run方法所属的对象告诉线程,让线程明确要执行的任务)
4,调用Thread类的start方法开启线程,运行指定线程任务的run()方法。

避免了单继承的局限性。

创建线程,用继承Thread类方法的局限性:当次类有父类时不能继承Thread类。

Run方法是扩展功能,子类应该实现接口。

Runable的作用:定义线程执行的任务,将任务封装成对象。
        好处:
                1,避免了单继承的局限性。
                2,降低耦合性:将低线程和执行任务的耦合性

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马