系列文章目录
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之间的奇数和偶数,并断点调试。
练习后可留言将答案发至评论中一起借鉴学习,谢谢!!