欲善编程,多看、敲、讨论;动眼、手、大脑。
1 为什么要用多线程
平常我们做crud的时候,用到多线程的机会不多。但当我们要处理一些复杂的业务时,或者提高程序处理效率时,就绕不开多线程的使用。也有些时候,我们需要对某个接口进行并发测试,也可以通过多线程来做一个性能测试小程序。
2 创建一个java线程类
我们先创建一个ThreadDemo类,并在里面创建一个MyThread内部类,MyThread继承Thread类。继承之后,MyThread就是一个线程类了,具备了线程类的所有属性。可以被主程序反复调用执行,不会导致主程序的堵塞。MyThread类代码如下图。
继承Thread类,实现run方法,是线程类的核心。本次线程实现了一个从1到100的报数功能。
3 启动线程
想要让线程跑起来,可以执行start()方法。注意,这里有一个很容易入的坑,我们创建线程对象后,调用的是线程对象的start的方法,而不是run方法。虽然两个方法都能执行run里面的代码。但本质上是不一样的。接下来小编将展示start和run的区别。
先创建三个不同的MyThread对象,并用线程的start方法启动。效果如下。
从上面的截图我们可以看到,虽然我们在主程序里,先执行线程A,但先报数的是线程B,当线程B报到4的时候,线程C开始报数,说明线程ABC在同时报数,而且每次执行,ABC三个线程报数顺序都不一样。
接下来,我们再看一看调用线程run方法。
你会发现,不管你执行多少次,都是线程A先报数报到100,再是线程B,再是线程C。很明显,run方法是在ThreadDemo类的主线程上执行,并没有创建新的线程去执行。
4 线程异常
我们不能对同一个线程同时执行start方法,比如刚才创建的线程A,同时调用两次start方法,这时第二次启动时会抛出异常:IllegalThreadStateException。异常效果如下图。
如果需要执行多次,就必须再new一个线程对象去start。
5 线程和进程
线程和进程类似,都是操作系统调用cpu来运行程序的单元。大家只要记住一点,线程是执行的最小单元,一个进程可以有一个或多个线程。
6 结束语
人人都是程序员,感谢您的阅读,欢迎关注。
领取专属 10元无门槛券
私享最新 技术干货