在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。
对于直接继承Thread的类来说,代码大致框架是:
/** * Test 继承Thread类,直接调用run方法 * */ class Test extends Thread { public Test () { } public Test (String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 " + i); } } public static void main(String[] args) { Test h1=new Test ("A"); Test h2=new Test ("B"); h1.run(); h2.run(); } private String name; }
【运行结果】:
A运行 0
A运行 1
A运行 2
A运行 3
A运行 4
B运行 0
B运行 1
B运行 2
B运行 3
B运行 4
我们会发现这些都是顺序执行的,说明我们的调用方法不对,应该调用的是start()方法。
当我们把上面的主函数修改为如下所示的时候:
public static void main(String[] args) { Test h1=new Test ("A"); Test h2=new Test ("B"); h1.start(); h2.start(); }
然后运行程序,输出的可能的结果如下:
A运行 0
B运行 0
B运行 1
B运行 2
B运行 3
B运行 4
A运行 1
A运行 2
A运行 3
A运行 4
因为需要用到CPU的资源,所以每次的运行结果基本是都不一样的
注意:虽然我们在这里调用的是start()方法,但是实际上调用的还是run()方法的主体。
/** * Test 实现Runnable接口 * */ class Test implements Runnable { public Test () { } public Test (String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 " + i); } } public static void main(String[] args) { Test h1=new Test ("线程A"); Thread demo= new Thread(h1); Test h2=new Test ("线程B"); Thread demo1=new Thread(h2); demo.start(); demo1.start(); } private String name; }
【可能的运行结果】:
线程A运行 0
线程B运行 0
线程B运行 1
线程B运行 2
线程B运行 3
线程B运行 4
线程A运行 1
线程A运行 2
线程A运行 3
线程A运行 4
关于选择继承Thread还是实现Runnable接口?
其实Thread也是实现Runnable接口的:
class Thread implements Runnable { //… public void run() { if (target != null) { target.run(); } } }
Thread和Runnable的区别:
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
/** * Test 继承Thread类,不能资源共享 * */ class Test extends Thread { public void run() { for (int i = 0; i < 7; i++) { if (count > 0) { System.out.println("count= " + count--); } } } public static void main(String[] args) { Test h1 = new Test (); Test h2 = new Test (); Test h3 = new Test (); h1.start(); h2.start(); h3.start(); } private int count = 5; }
【运行结果】:
count= 5
count= 4
count= 3
count= 2
count= 1
count= 5
count= 4
count= 3
count= 2
count= 1
count= 5
count= 4
count= 3
count= 2
count= 1
我们换为Runnable接口
class MyThread implements Runnable{ private int ticket = 5; //5张票 public void run() { for (int i=0; i<=20; i++) { if (this.ticket > 0) { System.out.println(Thread.currentThread().getName()+ "正在卖票"+this.ticket--); } } } } public class lzwCode { public static void main(String [] args) { MyThread my = new MyThread(); new Thread(my, "1号窗口").start(); new Thread(my, "2号窗口").start(); new Thread(my, "3号窗口").start(); } }
【运行结果】:
1号窗口正在买票5
1号窗口正在买票4
2号窗口正在买票3
3号窗口正在买票1
1号窗口正在买票2
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
相关推荐
Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...
4. **线程本地手柄(Thread-Local Handled Objects)** - 这个特性提供了更高效的方法来管理线程本地数据,减少了内存分配并提高了性能。 5. **改进的容器感知的HTTP客户端** - Java 10对内置的HTTP客户端API进行了...
文件"thinking-in-java-20010919.pdf"很可能就是《Thinking in Java》的2001年9月版,这个版本包含了当时的最新Java知识,虽然现在可能有更新的版本,但其核心理念和基础概念依然具有很高的学习价值。 在《Thinking...
【Java聊天室系统设计与开发】是一个典型的Java课程设计项目,旨在让学生掌握Java网络编程、多线程技术以及C/S架构的基本原理。该系统通过Java实现,构建了一个基于C/S模式的聊天室,包含了服务器端和客户端两部分。...
这个版本发布于2007年12月4日,是Java开发工具集的一个重要里程碑,用于构建和运行Java应用程序。 Java Development Kit(JDK)是Oracle公司提供的一个核心组件,它包含了Java编译器、Java虚拟机(JVM)、类库以及...
1. **Java基础知识**:涵盖语法、面向对象编程、异常处理、集合框架、多线程和IO流等Java核心概念。 2. **Eclipse使用指南**:包括Eclipse的安装配置、项目创建、代码编辑、调试技巧以及常用插件的介绍。 3. **...
【Java在线评测系统设计与开发】是一个典型的课程设计项目,主要目标是利用Java技术构建一个功能完善的在线评测系统。这个系统包含多个核心模块,旨在提供一个便捷、安全的在线考试平台。 1. **用户登录模块**: -...
在Java程序中,特别是涉及到GUI的程序,Java虚拟机会自动启动AWT事件队列线程(AWT-EventQueue)和AWT窗口线程(AWT-Windows)。AWT-EventQueue线程主要负责处理来自用户的各种交互事件,如点击按钮、移动窗口等。...
4. **线程同步**:为了确保线程安全,避免两个线程同时操作同一资源导致数据不一致,可能需要使用`synchronized`关键字或者`wait()`、`notify()`方法来协调线程间的执行顺序。例如,当一个线程正在改变圆的位置时,...
【标题】"收藏20200425-223758_java_" 提示我们这是一个关于Java编程语言的资源集合,可能是某个开发者在2020年4月25日22点37分58秒时整理的收藏夹。这个标题可能包含了各种Java相关的学习资料、代码示例、技术文章...
Java中的多线程是面试中常见的话题,因为它在并发编程中扮演着重要角色。线程允许应用程序同时执行多个任务,从而提高系统效率和响应性。理解线程的概念、创建方式以及状态转换对于Java开发者至关重要。 1. **线程...
例如,"yyyy-MM-dd"表示四位数的年份、两位数的月份和日期,"HH"代表24小时制的小时,"mm"代表分钟,"ss"代表秒,"ms"代表毫秒。 7. `java.text.DateFormat`: `DateFormat`是用于日期和时间格式化的抽象类。`...
这个压缩包包含了2019年8月14日时该Java项目的演示代码或者实例。在IT行业中,Java是一种广泛使用的、面向对象的编程语言,以其平台独立性、高效性和丰富的类库而受到青睐。这个项目可能涵盖了Java的基础知识,也...
标题“2013-11-07--JAVA学习资料”揭示了这是一个关于Java编程语言的学习资源集合,可能包含了教程、示例代码或者项目案例,时间标记为2013年11月7日,这暗示了这些资料可能是那个时期Java技术的实践应用。...
6. **线程安全**:Joda-Time的大部分类都是线程安全的,这在多线程环境下使用非常友好。 7. **日期间隔和时间间隔**:`Period`和`Interval`类可以用来表示日期之间的间隔和时间点之间的间隔,这在计算两个日期或...
Java集合框架是Java编程中非常重要的一个组成部分,它提供了存储和操作对象的高效方式。面试中,关于Java集合框架的问题经常出现,特别是对于List、Set、Map三大接口的理解及其实现类的特性。以下是对这些知识点的...
1. **Java 编程基础**:具备扎实的Java语言基础,能够遵循良好的代码编写规范,熟悉面向对象编程原理,熟练使用Java开发常用API,包括集合框架、多线程、网络编程等。 2. **Java Web开发**:精通Servlet、JSP、JSTL...