牛刀小试-如何创建线程之初体验(青铜篇1)

系列文章目录

1.创建线程和启动线程
2.了解创建线程的常见两种方式
3.了解在面向对象中为什么更偏向用runnable的实现而不是用theard的继承
4.注意踩坑点 启动线程的是start()而不是run()

文章目录

  • 系列文章目录
  • 1、创建线程和启动线程
  • 2、了解创建线程的常见两种方式
  • 3、了解在面向对象中为什么更偏向用runnable的实现而不是用theard的继承
  • 4、 注意踩坑点 启动线程的是start()而不是run()
  • 总结

1、创建线程和启动线程

public static void main(String[] args) {
     
        //    //创建线程
        //    Thread thread = new Thread();
       Thread neZhaplayer = new Thread(){
     
            public void run(){
     
                System.out.println("我是耗子  我去上路对抗");
            }
        };
       Thread erZhaplayer = new Thread(){
     
           public void run(){
     
               System.out.println("我是蔡徐坤  我在下路打篮球");
           }
       };
     Thread  saZhaplayer = new Thread(){
     
          public  void run(){
     
              System.out.println("我是汪洋  我在中路乱杀");
          }
      };
     //启动线程
         neZhaplayer.start();
         erZhaplayer.start();
         saZhaplayer.start();
    }

创造线程,启动线程只是我们的开始,而将我们想要的代码实现才是我们的目的,而线程是我们实现该目标的方式
可见多线程的重要性 在Java中线程的使用方式主要是以下两种方式

2、了解创建线程的常见两种方式

1.继承Thread并重写run方法;

//1.继承tread创建线程
    public static class  twoTread  extends Thread{
     
        public void run(){
     
            System.out.println("我是孙悟空  我去打野!!");
        }
    }
    //实现Runnable接口方法的调用
        new twoTread().start();

1.1 我们上述**1、**中用的就是继承Thread并重写run方法 只不过是匿名实现 我们也可以显示实现

2.实现Runnable接口并将其传递给Thread的构造器。

 //2.1 实现Runnable接口创建线程
    public static class OneRunnable  implements Runnable{
     
        public void run(){
     
            System.out.println("火男向前踢了一脚");
        }
    }
  Thread fourZaplayer = new Thread(new OneRunnable());
        //继承tread方法的调用
       fourZaplayer.start();  

3、了解在面向对象中为什么更偏向用runnable的实现而不是用theard的继承

  从本质上看,这两种方法没有区别,但从面向对象设计的角度,推荐用第二种实现runnable接口的方式,那为什么推荐第二种呢?
因为在面向对象设计中,有个约定俗成的规定,组合大于继承(组合优于继承(Prefer composition over inheritance),
并且在Java中一个类只能继承一个类,继承tread后就不能继承其他类了,类的继承都是单一的(仅且只能继承一个类不能继承多个,严重影响类的灵活性以及类的扩展性),
 所以如果不是有特有目的,重写父类方法尽量不用要继承;此外实现runnable接口与更高级的并发工具结合使用,此外,在Java中我们还可以通过ThreadFactory等工具类创建线程,
不过本质上仍是对这两种方法的封装
所以,相较于继承Thread,实现Runnable接口可以降低代码之间的耦合,保持更好的灵活性。关于这一原则的更多描述,我们可以参考一下《Effective Java》

4、 注意踩坑点 启动线程的是start()而不是run()

注意 请不要踩坑!!!!
作为像我一样刚开始认真学习tread的新手来说,很容易入坑。例如以下案例在启动线程时用的是run(),而不是start()
new Tread().run 同样可以输出结果看到我们期望的值,这也是为啥我们很容易入坑的原因
//这是因为,Runnable中的run()方法并不是你所创建的线程调用的,而是调用你这个线程的线程调用的,也就是主线程。那为什么直接调用run()方法也能看到输出呢?这是因为Thread中的run()会直接调用target中的run():

public void run() {
if (target != null) {
target.run();
}
}

我们直接调用run()并不会创建新的线程 这里我们要记住启动线程的是start()而不是run()即可

总结

今天就跟着秦二爷学习到这里 以上就是并发线程青铜篇一的全部内容 接下来是练习题
用两种不同的方式,创建出两个线程,交差打印1~100之间的奇数和偶数,并断点调试。
练习后可留言将答案发至评论中一起借鉴学习,谢谢!!

你可能感兴趣的:(thread,java)