一听到多线程编程,并发编程啥的,感觉挺高大上,可了解完之后,觉得挺简单,因为它形象呀~
小明一天用洗衣机洗衣服需要20分钟,托地板5分钟,擦桌子10分钟,晾衣服7分钟,请问小明做完这些事至少需要多长时间?怎么算?
不知读者对上述小学题是否有印象,这就涉及到了多线程。
概念解读 |
程序
一段静止的代码。编程,编程,就是编的这个“程序”吧。
进程
正在运行的一个程序
线程
一个进程内部的一条执行路径。每个java程序都有一个隐含的主线程:main方法。
多线程中,每次执行的顺序是不一样的,取决于谁先抢到CPU资源。这样就涉及到了调度策略:
- 时间片:谁先来谁先执行
- 抢占式:高优先级的线程抢占CPU。但是设置优先级只是说明抢占资源的概率变大了,并不能保证一定会抢到。
综述
如果网易云静止着,那它就是一个程序。运行起来,就是一个进程,比如我们在任务管理器中看到的那样
进程再细分,就是线程。比如我们听网易云的时候,一边听歌,还能一边找下一首想听的歌,这就是多线程。
单、多线程的区分 |
能用一条线穿起来的,是单线程。否则是多线程。
像这样,在半路撇开的,就是多线程:
创建多线程的两种方式 |
(1)继承java.lang.Thread类
具体实现就是上图。下图是升级版,即1个主线程,2个子线程。
(2)实现Runnable接口

(3)两者比较
实现的方式优于继承的方式,因为它避免了java单继承的局限性。而且如果多个线程要操作同一份数据(比如3个机器同时卖票),更适合用实现的方式。
多线程的使用 |
多线程的常用方法
其实我们在上面也已经涉及了挺多:
join()方法
在A线程中调用B线程的join方法,表示:当执行到此方法,A线程停止执行,直到B线程执行完毕后,A线程再接着join()之后的代码执行
运行结果
sleep()方法
sleep(long l):显式地让当前线程睡眠l毫秒
yield()方法
调用此方法的线程,释放当前cpu的执行权。接下来两者再次争抢。
运行过程:当主线程为整数时,释放资源。然后主线程和子线程两者再次争抢,谁抢到是谁的。
。
更多方法或者对方法的详细解释可以查看API文档: