您的位置:首页 > 其它

创建传统线程的方式

2016-09-14 19:47 120 查看

创建线程的两种传统方式

---》在Thread子类覆盖的run方法中编写运行代码

---》 在传递给Thread对象的Runnable对象的run方法中编写代码

---》总结:查看Thread对象的run方法的源代码,可以看到这两种方法都是在

        调用Thread对象的run方法,如果Thread类的run方法没有被覆盖,并且为该

        Thread对象设置了一个Runable对象,该run方法会调用Runnable对象的run

        方法

---》问题:如果在Thread子类覆盖的run方法中编写了运行代码,也为Thread子类对象传递

        了一个Runnable对象,那么,线程线程运行时的代码是子类的run方法的代码,还是Runnable

        对象的run方法的代码?

        涉及到的一个知识点,匿名内部类对象的构造方法如何调用父类的非默认构造方法。

---》多线程机制会提高程序的运行效率吗? 为什么会有多线程下载呢 ?

下面是代码的实现:

public static void main(String[]args) {

 //方式一

 Thread thread = new Thread() {

   @Override

   public void run () {

     while (true) {

    try{

   Thread.sleep(500);

} catch (InterruptedException e){

   e.printStackTrace() ;



 System.out.println(Thread.currentThread().getName());

}

}

thread.start();

//方式二:(留给读者自己去看源码为何这样实现)下面的Runnable表示线程所要执行的代码

 Thread thread2 = new Thread(new Runable(){

  @Override

   public void run () {

     while (true) {

    try{

   Thread.sleep(500);

} catch (InterruptedException e){

   e.printStackTrace() ;



 System.out.println(Thread.currentThread().getName());

});

}

thread2.start();

//方式三

 new Thread(new Runable(){

  @Override

   public void run () {

     while (true) {

    try{

   Thread.sleep(500);

} catch (InterruptedException e){

   e.printStackTrace() ;



 System.out.println("Runnable"+Thread.currentThread().getName());

})) {
   @Override

   public void run () {

     while (true) {

    try{

   Thread.sleep(500);

} catch (InterruptedException e){

   e.printStackTrace() ;



 System.out.println("Thread"+Thread.currentThread().getName());

}

}).start();
}

思考:方式三运行的代码是Runable的代码还是Thread的代码,答案是Thread中的代码

分析:首先是new 了一个Thread的子类,然后在Thread构造中创建了一个Runnable的方法,

            调用start()先去找的是new Thread()中的run方法,找自己的run方法,如果没找到用自己

            父类的方法,父类的方法会去找Runnable运行,子类的run方法把父类的run方法覆盖了
            所以以子类的方法为准,父类的全部都失效了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: