Java 多线程-基础(Thread篇)
编程技术  /  houtizong 发布于 3年前   120
在进入正题前,我们还是先来问两个问题,什么叫“多线程”? 以及“Java多线程”跟“多线程”有什么联系?
好吧,问题看似简单但也抽象,想要搞清楚答案,我们还是回到现实生活中找找答案吧。
现在两小夫妻就驰骋在一条单向四车道的草原高速公路上,去60公里外的A城办结婚证,车很多但至少能保持120码全速行驶,贼爽了!不到半个小时就快下高速了~~~但是,“我了个去!咋收费口就一个?”,高速上没其他出口,排队吧。。。
经过了一个小时的挪动,他俩终于过了收费口,马不停蹄地赶去行政中心,满心欢喜地等着领取这本的“合法持枪证”,“今天真是个好日子!满大厅的人等着领证呢!我了个去!咋办证口就一个?”,不领证不行,排队吧。。。
好了,这时候如果让你来缓解上面两个拥堵状况,你的方案是什么?很显然,你会想到多开几个窗口同时服务呗!如果把进程比作高速公路收费站和民政局大厅,那么每一个收费口和领证窗口就是一个线程,当同时有多个线程一起工作时,就是我们所说的“多线程”啦!
那“Java多线程”呢?嘿嘿,就不卖关子了,就是用Java语言实现的“多线程”!哈哈,淡定,其实这是有意义的,因为不是所有语言都支持“多线程”,Java是少数几种支持“多线程”的语言之一,记住了!
其实不仅日常生活中,在很多应用程序中多线程也非常普及了,比如Eclipse-支持多窗口切换编辑,浏览器-支持多标签访问,迅雷-多线程下载等等。如果以上应用都是单线程的,那势必没人会用他们的产品。
ok,接下来我们来看看Java的多线程到底长啥样。
注:Java多线程的一种实现方式是集成Thread类,那难道还有其他实现方式?当然,但后面再讲,我们先来了解Thread类
public class ThreadDemoOne extends Thread {int no,workno,sleeptime;public ThreadDemoOne(int no,int workno,int sleeptime) {// TODO Auto-generated constructor stubthis.no = no;this.workno = workno;this.sleeptime = sleeptime;}@Overridepublic void run() {// TODO Auto-generated method stubtry {Thread.sleep(sleeptime);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("Thread["+no+"] do work "+workno);}public static void main(String[] args) {System.out.println("Main do work 1");new ThreadDemoOne(1,2,3000).run();System.out.println("Main do work 3");System.out.println("Main do work 4");new ThreadDemoOne(2,5,1000).run();}}
运行起来,看看结果,走你~
Main do work 1
Thread[1] do work 2
Main do work 3
Main do work 4
Thread[2] do work 5
结果跑出来了!别急,这乍看效果不错,仔细看,这依旧是顺序执行任务嘛,跟一个收费口的效果是一样的,并没有达到所谓的多个任务同时运行啊。认真看过书的同学应该已经发现,问题就出在run()方法上,run()是实现多线程必须覆写的方法,但激活多线程的方法是start()。好吧,知道原因了,我们就来改代码吧:
public class ThreadDemoOne extends Thread {int no,workno,sleeptime;public ThreadDemoOne(int no,int workno,int sleeptime) {// TODO Auto-generated constructor stubthis.no = no;this.workno = workno;this.sleeptime = sleeptime;}@Overridepublic void run() {// TODO Auto-generated method stubtry {Thread.sleep(sleeptime);//休息“sleeptime”时间} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("Thread["+no+"] do work "+workno);}public static void main(String[] args) {System.out.println("Main do work 1");new ThreadDemoOne(1,2,3000).start();System.out.println("Main do work 3");System.out.println("Main do work 4");new ThreadDemoOne(2,5,1000).start();}}
再运行一次:
Main do work 1
Main do work 3
Main do work 4
Thread[2] do work 5
Thread[1] do work 2
有同学要问,为什么work2先调用,结果比work5晚输出?那这个请看官仔细看Thread.sleep这个方法,就不赘述了。
OK,从结果我们发现,Main顺序地执行自己的1,3,4号任务,把2号任务丢给了线程1,把5号任务丢个了线程2,这样就达到了三个线程一起做事情的效果。又有同学要问了,我只看到Main把任务丢给了Thread做,但并没看到他们一起做啊。
OK,请看下面:
public class ThreadDemoOne extends Thread {int no,workno,sleeptime;public ThreadDemoOne(int no,int workno,int sleeptime) {// TODO Auto-generated constructor stubthis.no = no;this.workno = workno;this.sleeptime = sleeptime;}@Overridepublic void run() {// TODO Auto-generated method stubtry {for(int i=0;i<5;i++){System.out.println("Thread["+no+"] do work "+workno+"_"+i);Thread.sleep(1000);}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) throws InterruptedException {System.out.println("Main do work 1");new ThreadDemoOne(1,2,1000).start();System.out.println("Main do work 3");Thread.sleep(1000);System.out.println("Main do work 4");new ThreadDemoOne(2,5,1000).start();Thread.sleep(1000);System.out.println("Main do work 6");}}
Main do work 1
Main do work 3
Thread[1] do work 2_0
Thread[1] do work 2_1
Main do work 4
Thread[2] do work 5_0
Main do work 6
Thread[2] do work 5_1
Thread[1] do work 2_2
Thread[2] do work 5_2
Thread[1] do work 2_3
Thread[2] do work 5_3
Thread[1] do work 2_4
Thread[2] do work 5_4
事实胜于雄辩,请看官参详~
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接