什么是多线程?
在进入正题前,我们还是先来问两个问题,什么叫“多线程”? 以及“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 stub this.no = no; this.workno = workno; this.sleeptime = sleeptime; } @Override public void run() { // TODO Auto-generated method stub try { Thread.sleep(sleeptime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.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 stub this.no = no; this.workno = workno; this.sleeptime = sleeptime; } @Override public void run() { // TODO Auto-generated method stub try { Thread.sleep(sleeptime);//休息“sleeptime”时间 } catch (InterruptedException e) { // TODO Auto-generated catch block e.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 stub this.no = no; this.workno = workno; this.sleeptime = sleeptime; } @Override public void run() { // TODO Auto-generated method stub try { 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 block e.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
事实胜于雄辩,请看官参详~
相关推荐
Java多线程--Thread类的常用结构及线程优先级
Java多线程--创建多线程的基本方式一:继承Thread类
java多线程按需交替执行,java新特性。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
Java线程-第三版(CHM电子版)
计算机后端-Java-Java核心基础-第20章 多线程 10. 同步方法处理继承Thread类的线程安全
计算机后端-Java-Java核心基础-第20章 多线程 08. 同步代码块处理继承Thread类的线程安
计算机后端-Java-Java核心基础-第19章 IDEA的使用与多线程 18. 例题:继承Thread方式,
Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...
java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号 java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号
Java 模拟线程并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发
Java多线程,进程与线程概念 创建和启动Java线程 线程状态和线程控制 多线程的互斥与同步 线程的通讯 死锁的概念
本压缩包,总共包含两个文档,JAVA多线程编程详解-详细操作例子和 Java多线 程编程总结 例如,runnable、thread、stop()、 suspend、yield、setPriority()、getPriority()、synchronized、wait()、join、线程池同步...
继承Thread类: 1必须重写run 方法:里面放置的实际的线程体 2 启动线程: 3创建Thread对象 4调用Thread对象的start 方法启动线程
对多线程进行了由浅入深的讲解,有丰富的实例让初学者更容易上手
这里面有用Java实现的多线程下载的源程序,且是用NetBeans写的用户界面,方便大家阅读程序。
运用多线程技术,练习Thread类得run方法和start方法。运用进度条显式表示下载进度。java多线程之赛马程序
java 多线程 数据流 tcp thread i/o
6个非常经典的java多线程实例!欢迎下载!!!