什么是多线程?
在进入正题前,我们还是先来问两个问题,什么叫“多线程”? 以及“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 类和 Runnable 接口来实现,而 Socket 编程则需要使用 java.net 包中的相关类来实现。 在 Java 多线程-Socket 编程中,客户端和服务器端都需要使用 Socket 来进行通信。客户端...
在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...
- **负载均衡**:在多线程服务器应用中,可以根据核心的负载情况动态调整线程绑定,确保资源的均匀分配。 - **减少竞态条件**:在某些同步问题上,绑定线程到特定核心可以降低竞争同一资源的概率,有助于减少竞态...
### Java多线程--让主线程等待所有子线程执行完毕 #### 核心知识点解析 在Java多线程环境中,让主线程等待所有子线程执行完毕是一个常见的需求,尤其是在处理大量数据或进行高性能计算时。这不仅有助于正确测量...
《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...
在Java多线程编程中,有时我们需要确保所有子线程执行完毕后再进行后续操作,例如在并发测试、数据聚合或资源清理等场景。本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`...
Java多线程编程是开发高并发应用的基础,其中Thread类是实现多线程的核心类。本文将详细解析Thread类的常用结构以及线程优先级。 一、Thread类的常用结构 1. 线程中的构造器 - `Thread()`:创建一个没有指定名称...
【Java多线程-创建多线程的基本方式一:继承Thread类】 在Java编程中,多线程是一种并发执行任务的机制,它允许多个任务在同一时间运行,从而提高程序的效率和响应速度。Java提供了多种创建多线程的方式,其中最...
逐步深入到Java多线程的高级话题,涵盖了Java多线程的所有方面,包括volatile关键字、Java内存模型、Happens-Before关系、synchronized关键字、ConcurrentHashMap、CopyOnWriteArrayList、Thread安全和CAS操作等。...
【JAVA程序员必读--基础篇】是一份专为初学者设计的Java编程教程,它深入浅出地介绍了Java语言的基础概念和核心语法,是面向对象编程的入门佳选。这份资料精心编排,旨在帮助新手快速掌握Java编程的核心技能。 在...
内容概要:本文详细介绍了Java多线程的基础概念和关键技术点。首先解释了线程的基本概念、线程与进程的区别及其不同状态。接着,通过三种方式创建线程(继承Thread类、实现Runnable接口、使用Callable和Future接口)...
在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应性。本节我们将深入探讨Java中的多线程概念,包括其重要性、创建方法以及相关机制。 一、多线程的重要性 1....
在Java多线程编程中,线程安全问题是非常关键的概念,它涉及到多个线程访问共享资源时可能出现的数据不一致或异常情况。本题主要通过两个练习题来加深对线程安全的理解。 ### 练习题1:新年倒计时 #### 题目描述 ...
总结,实现`Runnable`接口是创建Java多线程的一种常见方式,它提供了更大的灵活性,尤其是在需要多继承或者线程之间需要共享数据的情况下。掌握这两种创建线程的方法,并了解其适用场景,对于编写高效的并发程序至关...
Java多线程学习是编程领域中的重要一环,特别是在服务器端和网络编程中,多线程技术能够有效地利用系统资源,提高程序的并发性。FTP(File Transfer Protocol)上传则是通过网络将本地文件传输到远程服务器的过程。...
本资料“java-Thread-study-summary.zip”提供了一个深入学习Java多线程的综合指南,特别适合初学者进行实践操作。 1. **线程的创建** - 继承`Thread`类:创建一个新的类,该类继承自`Thread`,然后重写`run()`...
### Java多线程-JDK5.0新增线程创建方式 #### 一、新增方式1:实现Callable接口 ##### (1)介绍 自Java 5.0起,为提高线程管理的灵活性与效率,引入了`Callable`接口,这是一种全新的创建线程的方式。与传统的`...
Java多线程是Java语言中的一个重要特性,它允许程序同时执行多个不同的任务,从而提高程序的效率和响应性。在操作系统层面,实现并发最常见的方式是通过进程和线程。进程是具有独立内存空间的执行单元,而线程是进程...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。接下来,我们将深入探讨这两个方法以及相关的...
在Java多线程编程中,线程间的通信是非常重要的概念,用于协调多个并发执行的任务。线程的状态转换是理解线程通信的基础,主要包括四个状态:新(New)、可执行(Runnable)、死亡(Dead)和停滞(Blocked)。新状态...