Java 多线程-基础(Thread篇)

编程技术  /  houtizong 发布于 3年前   120
什么是多线程?

         在进入正题前,我们还是先来问两个问题,什么叫“多线程”? 以及“Java多线程”跟“多线程”有什么联系?

          好吧,问题看似简单但也抽象,想要搞清楚答案,我们还是回到现实生活中找找答案吧。

          现在两小夫妻就驰骋在一条单向四车道的草原高速公路上,去60公里外的A城办结婚证,车很多但至少能保持120码全速行驶,贼爽了!不到半个小时就快下高速了~~~但是,“我了个去!咋收费口就一个?”,高速上没其他出口,排队吧。。。

           经过了一个小时的挪动,他俩终于过了收费口,马不停蹄地赶去行政中心,满心欢喜地等着领取这本的“合法持枪证”,“今天真是个好日子!满大厅的人等着领证呢!我了个去!咋办证口就一个?”,不领证不行,排队吧。。。

           好了,这时候如果让你来缓解上面两个拥堵状况,你的方案是什么?很显然,你会想到多开几个窗口同时服务呗!如果把进程比作高速公路收费站和民政局大厅,那么每一个收费口和领证窗口就是一个线程,当同时有多个线程一起工作时,就是我们所说的“多线程”啦!

           那“Java多线程”呢?嘿嘿,就不卖关子了,就是用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];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客