`
songzhan
  • 浏览: 247767 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

4月24 -- java 线程

阅读更多

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();
        }
        }
}

 ThreadRunnable的区别:

如果一个类继承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源码包---java 源码 大量 实例

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    jd-gui java10版本

    4. **线程本地手柄(Thread-Local Handled Objects)** - 这个特性提供了更高效的方法来管理线程本地数据,减少了内存分配并提高了性能。 5. **改进的容器感知的HTTP客户端** - Java 10对内置的HTTP客户端API进行了...

    thinking-in-java_java_in_ThinkinginJava_

    文件"thinking-in-java-20010919.pdf"很可能就是《Thinking in Java》的2001年9月版,这个版本包含了当时的最新Java知识,虽然现在可能有更新的版本,但其核心理念和基础概念依然具有很高的学习价值。 在《Thinking...

    java课程设计---java聊天室的系统的设计与开发(含代码)-java.pdf

    【Java聊天室系统设计与开发】是一个典型的Java课程设计项目,旨在让学生掌握Java网络编程、多线程技术以及C/S架构的基本原理。该系统通过Java实现,构建了一个基于C/S模式的聊天室,包含了服务器端和客户端两部分。...

    jdk-7-ea-bin-b24-windows-i586-04_dec_2007

    这个版本发布于2007年12月4日,是Java开发工具集的一个重要里程碑,用于构建和运行Java应用程序。 Java Development Kit(JDK)是Oracle公司提供的一个核心组件,它包含了Java编译器、Java虚拟机(JVM)、类库以及...

    xiaobao---java开发编程笔记整理

    1. **Java基础知识**:涵盖语法、面向对象编程、异常处理、集合框架、多线程和IO流等Java核心概念。 2. **Eclipse使用指南**:包括Eclipse的安装配置、项目创建、代码编辑、调试技巧以及常用插件的介绍。 3. **...

    java课程设计---基于Java的在线评测系统的设计与开发.pdf

    【Java在线评测系统设计与开发】是一个典型的课程设计项目,主要目标是利用Java技术构建一个功能完善的在线评测系统。这个系统包含多个核心模块,旨在提供一个便捷、安全的在线考试平台。 1. **用户登录模块**: -...

    JAVA实验报告月亮围绕地球

    在Java程序中,特别是涉及到GUI的程序,Java虚拟机会自动启动AWT事件队列线程(AWT-EventQueue)和AWT窗口线程(AWT-Windows)。AWT-EventQueue线程主要负责处理来自用户的各种交互事件,如点击按钮、移动窗口等。...

    java 多线程编程 月食效果

    4. **线程同步**:为了确保线程安全,避免两个线程同时操作同一资源导致数据不一致,可能需要使用`synchronized`关键字或者`wait()`、`notify()`方法来协调线程间的执行顺序。例如,当一个线程正在改变圆的位置时,...

    收藏20200425-223758_java_

    【标题】"收藏20200425-223758_java_" 提示我们这是一个关于Java编程语言的资源集合,可能是某个开发者在2020年4月25日22点37分58秒时整理的收藏夹。这个标题可能包含了各种Java相关的学习资料、代码示例、技术文章...

    java面试题之多线程.pdf

    Java中的多线程是面试中常见的话题,因为它在并发编程中扮演着重要角色。线程允许应用程序同时执行多个任务,从而提高系统效率和响应性。理解线程的概念、创建方式以及状态转换对于Java开发者至关重要。 1. **线程...

    JAVA时间格式化处理-JAVA程序员JAVA工程师面试必看.pdf

    例如,"yyyy-MM-dd"表示四位数的年份、两位数的月份和日期,"HH"代表24小时制的小时,"mm"代表分钟,"ss"代表秒,"ms"代表毫秒。 7. `java.text.DateFormat`: `DateFormat`是用于日期和时间格式化的抽象类。`...

    东信EST-100 Java demo 20190814.zip

    这个压缩包包含了2019年8月14日时该Java项目的演示代码或者实例。在IT行业中,Java是一种广泛使用的、面向对象的编程语言,以其平台独立性、高效性和丰富的类库而受到青睐。这个项目可能涵盖了Java的基础知识,也...

    2013-11-07--JAVA学习资料

    标题“2013-11-07--JAVA学习资料”揭示了这是一个关于Java编程语言的学习资源集合,可能包含了教程、示例代码或者项目案例,时间标记为2013年11月7日,这暗示了这些资料可能是那个时期Java技术的实践应用。...

    Joda-Time标准Java日期和时间类的一个高质量替代品

    6. **线程安全**:Joda-Time的大部分类都是线程安全的,这在多线程环境下使用非常友好。 7. **日期间隔和时间间隔**:`Period`和`Interval`类可以用来表示日期之间的间隔和时间点之间的间隔,这在计算两个日期或...

    2021-3月Java面试题.docx

    Java集合框架是Java编程中非常重要的一个组成部分,它提供了存储和操作对象的高效方式。面试中,关于Java集合框架的问题经常出现,特别是对于List、Set、Map三大接口的理解及其实现类的特性。以下是对这些知识点的...

    JavaEE求职简历-姓名-JAVA开发工程师.docx

    1. **Java 编程基础**:具备扎实的Java语言基础,能够遵循良好的代码编写规范,熟悉面向对象编程原理,熟练使用Java开发常用API,包括集合框架、多线程、网络编程等。 2. **Java Web开发**:精通Servlet、JSP、JSTL...

Global site tag (gtag.js) - Google Analytics