1. 多线程实现最核心的机制

一个程序在其执行过程中, 可以产生多个线程, 形成多条执行线索。,每条线程,有产生、存在和消亡的过程,并且独立完成各自的功能,互不干扰。

多线程程序运行只占用一个CPU,使用“时间片轮转法”运行程序,如图:

2. Java中的多线程实现

Java应用程序总是从主类的main()方法开始执行,如果main()方法中创建了其它线程,在主线程和其它线程之间轮流切换执行,保证每个线程都有机会使用CPU,直到程序中所有线程都结束, Java应用程序才结束。

在Java中,每个线程的状态有以下四种:

线程状态切换时调用的方法在图中已标示出来,这些对线程进行操作的方法都在java.lang.Thread 类中,这个类是专门用来创建线程和对线程进行操作的类,还包括特殊的 run( )方法。

在Java中,创建线程有两种方法:

  • 继承Thread类
  • 实现Runnable接口

线程创建方法1—继承Thread类

具体定义方法如下:

  • ① 定义类的时候继承Thread类;
  • ② 重写 Thread 类的 run() 方法;
  • ③ 准备在线程中完成的工作放在run() 方法实现;

定义之后创建对象,然后通过该对象调用start()方法即可启动线程。

示例代码如下:

import java.lang.Thread;class MyThread extends Thread {String name;int count;MyThread(String name, int count){this.name = name;this.count = count;}public void run() {for(int i = 0; i < count;i++) {System.out.println(name + ":" + i);}}
}public class ThreadTest {public static void main(String[] args) {//创建线程MyThread myThread1 = new MyThread("A",5);MyThread myThread2 = new MyThread("B",5);//启动线程myThread1.run();myThread2.run();}
}

运行效果如下:

线程创建方法2—实现Runnable接口

具体定义方法如下:

  • ① 定义类的时候实现Runnable接口;
  • ② 重写接口中的 run() 方法;
  • ③ 准备在线程中完成的工作放在run() 方法实现;

定义之后创建对象,然后通过该对象调用start()方法即可启动线程。

示例代码如下:

import java.lang.Thread;class MyTestThread implements Runnable{String name;int count;MyTestThread(String name, int count){this.name = name;this.count = count;}public void run() {for(int i = 0; i < count;i++) {System.out.println(name + ":" + i);}}
}public class ThreadTest2 {public static void main(String[] args) {//创建线程MyTestThread myThread1 = new MyTestThread("A",3);MyTestThread myThread2 = new MyTestThread("B",3);//启动线程myThread1.run();myThread2.run();}
}

运行效果如下:

3. 多线程之间的同步和互斥

在多线程程序中,可能会有两个甚至更多的线程试图同时访问一个有限的资源,在编写程序时必须对这种潜在资源冲突进行预防。

为了解决这种冲突,在线程使用一个资源时为其加锁即可,访问资源的第一个线程为其加上锁以后,其他线程便不能再使用那个资源,除非被解锁

加锁的方法非常简单,只需要对于访问某个关键共享资源的所有方法,加上synchronized修饰符即可,比如:

synchronized void f();

加锁之后,其它线程想使用这个方法时就必须等待,直到线程A 使用完该方法,除非线程A主动让出CPU资源。

示例代码如下:

import java.lang.Thread;class MySyncThread implements Runnable{String name;int count;/* 所有该类对象共享资源 */private static int number = 100;MySyncThread(String name, int count){this.name = name;this.count = count;}public void run() {int temp;for(int i = 0; i < count;i++) {temp = sub();System.out.println(name + ":number = " + number);//主动挂起,让出CPUtry {Thread.sleep(2000);}catch (Exception e) {System.out.println("发生异常啦!");}}}/* 上锁 */public  synchronized int sub() {number--;return number;}
}public class ThreadTest3 {public static void main(String[] args) {//创建线程MySyncThread myThread1 = new MySyncThread("A",3);MySyncThread myThread2 = new MySyncThread("B",3);//启动线程myThread1.run();myThread2.run();}
}

运行效果如下:

Java基础_17 | Java多线程程序设计(Java中两种创建线程的方法、多线程之间的同步和互斥)相关推荐

  1. [重学Java基础][Java IO流][Exter.2]IO流中几种不同的读写方法的区别

    [重学Java基础][Java IO流][Exter.2]IO流中几种不同的读写方法的区别 Read 读入方法 read(): 一般是这种形式 public int read() 1.从流数据中读取的 ...

  2. java基础 通过继承Thread类和实现Runnable接口创建线程

    java 创建线程 Java中,线程也是一种对象,但不是任何对象都可以成为线程. 只有实现了Runnable接口或继承了Thread类的对象才能成为线程. 继承Thread类 //格式: class ...

  3. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之工厂方法模式

    · 工厂方法模式在王者荣耀中的应用 · 一.简述 王者荣耀这款游戏目前一共有100位英雄,游戏设计师根据英雄技能.属性.天赋等因素,将英雄划分为射手.辅助.打野.法师.坦克.战士等职业. 在本实例中, ...

  4. Android 中三种启用线程的方法

    多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发 先调用start后调用run 1.start()方法来启动线程,真正实现了多线程运行. 这时无需等待run方法体代码执行完毕,可以直接继 ...

  5. java基础提升篇:深入浅出Java多线程

    初遇 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别的形式,但多线程 ...

  6. java定时器只执行一次_搞定Java并发:为什么说只有1种实现线程的方法?(下)...

    在 上一篇(戳下看前情) 中,徐大带我们详细论证了,所有实现线程的方式归根结底就是基于 Runnable 接口或继承 Thread 类.接下来,请徐大继续解释,为什么说这两种方式本质上是一种. 一. ...

  7. 多线程(一) 线程概念及创建线程的方法

    多线程(一) 多线程基础 前言 我只是一个新上路的小菜鸟,通过分享自己的所学来巩固知识,文中如有错误希望能够指出改正. 一.线程的相关概念 程序 程序是为了完成特定任务,用某种语言编写的一组指令的集合 ...

  8. Java基础系列五 面向对象程序设计

    Java基础系列第一章 初识Java语言 Java基础系列第二章 Java语言基础 Java基础系列第三章 Java流程控制 Java基础系列第四章 Java数组与字符串 Java基础系列第五章 面向 ...

  9. java基础(十三)-----详解内部类——Java高级开发必须懂的

    java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...

最新文章

  1. PS色调均化滤镜的快捷实现(C#源代码)。
  2. 三、垃圾收集之判断对象是否存活
  3. hdu 杭电 1045 Fire Net
  4. SAP历史库存MB5B的详解
  5. Andrew NG 机器学习编程作业5 Octave
  6. Ant Design Form.Item的label中文字换行的替代方式
  7. 866. 试除法判定质数
  8. 数学建模 整数规划的基本原理和标准形式
  9. sql server 按照日期自动生成单据编号的函数
  10. Java8中String.join方法,让我们的代码更优美
  11. Tensorflow 实战 Google 深度学习框架(第2版)---- 10.2.2节 P274 代码
  12. Paxos 算法详解
  13. 模块化机房建设指导书_模块化机房建设方案.doc
  14. Intel正式发布新一代Atom处理器
  15. AutoIt的录制(AU3Record)
  16. 服务器搭建是基于操作系统的,服务器搭建是基于操作系统的
  17. 一键关机 / 重启脚本
  18. coco2d-html5制作弹弓射鸟第一部分---橡皮筋
  19. 数字逻辑计算机组成,数字逻辑设计与计算机组成pdf
  20. vmware virtual machine must be running in order to be migrated

热门文章

  1. Nature综述:宏基因组测序研究耐药基因的方法和资源
  2. 腾讯云轻量8核16G服务器18M带宽CPU流量性能测评
  3. 第13章-1~3 法兰接头预紧力密封接触分析(模型简化、网格调整、约束)并行计算设置、摩擦接触设置adjust to touch 、约束设置frictionless support、bolt
  4. java对opengl绑定_你好,JOGL - Java与OpenGl的绑定-Java频道-中国IT实验室
  5. 网页游戏开发基础——Canvas基本图形绘制
  6. 高等数学笔记-乐经良老师-第五章-积分(Ⅱ)-定积分的应用-第六节-定积分的应用
  7. Python编程从入门到实践 动手试一试 代码合集
  8. java实现按比例缩放图片技巧
  9. 利用爬虫获取免费IP代理
  10. 手机与存储卡空间大小剩余怎么获取