当前位置: 首页 > news >正文

JAVA的多线程

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口,下面通过具体代码来看它们的区别

(1)继承Thread实现多线程

package cn.com.thread.demo;

class MyThread1 extends Thread {
    private String name;
    public MyThread1(String name) {
        super();
        this.name = name;
    }
    public void run() {
        for(int i = 0; i < 100; i ++) {
            System.out.println("线程开始:"+ this.name +",i="+i);
        }
    }
}

public class ThreadDemo01 {

    public static void main(String[] args) {
    
        MyThread1 mt1 = new MyThread1("线程a");
        MyThread1 mt2 = new MyThread1("线程b");
        
        /*直接调用类的方法,结果是跟调用普通类的方法一样,执行完一个,再执行另一个,达不到多线程工作的效果*/
        //mt1.run();
        //mt2.run();
        
        /*用start()方法启动线程*/
        mt1.start();
        mt2.start();
        
    }
}

(2)实现Runnable接口产生多线程

package cn.com.thread.demo;

class MyThread2 implements Runnable {
    private String name;
    public MyThread2(String name) {
        this.name = name;
    }
    public void run() {
        for(int i = 0; i < 100; i ++) {
            System.out.println("线程开始:"+ this.name +",i="+i);
        }
    }
}


public class RunnableThread {

    public static void main(String[] args) {
        
        MyThread2 mt1 = new MyThread2("线程a");
        MyThread2 mt2 = new MyThread2("线程b");
        
        /*但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。
         此时观察Thread类,有一个构造方法:public Thread(Runnable targer)
         此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。*/
        new Thread(mt1).start();
        new Thread(mt2).start();
        
        /*或者下面的写法*/
        /*Thread t1 = new Thread(mt1);
        Thread t2 = new Thread(mt2);
        t1.start();
        t2.start();*/
    }
}


(3)Thread 和Runnable 两种实现方式的区别和联系:
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
    避免点继承的局限,一个类可以继承多个接口。
    适合于资源的共享 
 以卖票程序为例,通过Thread类完成:

package cn.com.thread.demo;

class MyThread3 implements Runnable {
    private int ticket = 50;
    public void run() {
        for (int i = 0; i < 60; i ++) {
            if(this.ticket > 0) {
                System.out.println("卖票:ticket" + this.ticket--);
            }
        }
    }
}

public class ThreadTicket {
    
    public static void main(String[] args) {
        
        MyThread3 mt = new MyThread3();
        
        /*在Runnable生成的线程中可以用一个实例在多个线程中调用*/
        new Thread(mt).start(); 
        new Thread(mt).start();
        new Thread(mt).start();
    }

}

 

 

相关文章:

  • virtualenv安装问题
  • Qmail+Vpopmail 安装相关文档
  • as2 针对加载进来的swf操作
  • 设置IE浏览器默认的下载路径
  • Centos 7下nginx开机自启动脚本
  • 第一章:The Missing Code Library--3.正常化日期格式
  • [Step By Step]在SAP Business Objects Data Services中使用SQL Transform将数据导入到SAP HANA中(SQL Transform)...
  • RTOS姊妹花——Small RTOS与STOS++简介
  • 微服务架构适用场景分析
  • 尚科推广专家当于同行的一款独立软式解决方案
  • 《Typecript 入门教程》 3、接口
  • 《把时间当朋友》 读书笔记
  • 在开发中你可能没有考虑到的两个性能优化
  • Kali***(二)之被动信息收集——搜索引擎
  • 编码格式导致批处理文件bat文件不能执行
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【刷算法】求1+2+3+...+n
  • crontab执行失败的多种原因
  • CSS盒模型深入
  • CSS魔法堂:Absolute Positioning就这个样
  • ECMAScript入门(七)--Module语法
  • github指令
  • JAVA并发编程--1.基础概念
  • Java知识点总结(JavaIO-打印流)
  • overflow: hidden IE7无效
  • scala基础语法(二)
  • spring boot下thymeleaf全局静态变量配置
  • springMvc学习笔记(2)
  • vue的全局变量和全局拦截请求器
  • 对象引论
  • 复杂数据处理
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 聚簇索引和非聚簇索引
  • 使用docker-compose进行多节点部署
  • 突破自己的技术思维
  • 智能网联汽车信息安全
  • gunicorn工作原理
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 数论-逆元
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • ###STL(标准模板库)
  • (Java)【深基9.例1】选举学生会
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)Linux——Linux常用指令
  • (二)WCF的Binding模型
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (附源码)计算机毕业设计高校学生选课系统
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (四) 虚拟摄像头vivi体验
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)平衡树
  • (转载)Linux网络编程入门
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例