Java基础_17 | Java多线程程序设计(Java中两种创建线程的方法、多线程之间的同步和互斥)
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中两种创建线程的方法、多线程之间的同步和互斥)相关推荐
- [重学Java基础][Java IO流][Exter.2]IO流中几种不同的读写方法的区别
[重学Java基础][Java IO流][Exter.2]IO流中几种不同的读写方法的区别 Read 读入方法 read(): 一般是这种形式 public int read() 1.从流数据中读取的 ...
- java基础 通过继承Thread类和实现Runnable接口创建线程
java 创建线程 Java中,线程也是一种对象,但不是任何对象都可以成为线程. 只有实现了Runnable接口或继承了Thread类的对象才能成为线程. 继承Thread类 //格式: class ...
- 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之工厂方法模式
· 工厂方法模式在王者荣耀中的应用 · 一.简述 王者荣耀这款游戏目前一共有100位英雄,游戏设计师根据英雄技能.属性.天赋等因素,将英雄划分为射手.辅助.打野.法师.坦克.战士等职业. 在本实例中, ...
- Android 中三种启用线程的方法
多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发 先调用start后调用run 1.start()方法来启动线程,真正实现了多线程运行. 这时无需等待run方法体代码执行完毕,可以直接继 ...
- java基础提升篇:深入浅出Java多线程
初遇 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别的形式,但多线程 ...
- java定时器只执行一次_搞定Java并发:为什么说只有1种实现线程的方法?(下)...
在 上一篇(戳下看前情) 中,徐大带我们详细论证了,所有实现线程的方式归根结底就是基于 Runnable 接口或继承 Thread 类.接下来,请徐大继续解释,为什么说这两种方式本质上是一种. 一. ...
- 多线程(一) 线程概念及创建线程的方法
多线程(一) 多线程基础 前言 我只是一个新上路的小菜鸟,通过分享自己的所学来巩固知识,文中如有错误希望能够指出改正. 一.线程的相关概念 程序 程序是为了完成特定任务,用某种语言编写的一组指令的集合 ...
- Java基础系列五 面向对象程序设计
Java基础系列第一章 初识Java语言 Java基础系列第二章 Java语言基础 Java基础系列第三章 Java流程控制 Java基础系列第四章 Java数组与字符串 Java基础系列第五章 面向 ...
- java基础(十三)-----详解内部类——Java高级开发必须懂的
java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...
最新文章
- PS色调均化滤镜的快捷实现(C#源代码)。
- 三、垃圾收集之判断对象是否存活
- hdu 杭电 1045 Fire Net
- SAP历史库存MB5B的详解
- Andrew NG 机器学习编程作业5 Octave
- Ant Design Form.Item的label中文字换行的替代方式
- 866. 试除法判定质数
- 数学建模 整数规划的基本原理和标准形式
- sql server 按照日期自动生成单据编号的函数
- Java8中String.join方法,让我们的代码更优美
- Tensorflow 实战 Google 深度学习框架(第2版)---- 10.2.2节 P274 代码
- Paxos 算法详解
- 模块化机房建设指导书_模块化机房建设方案.doc
- Intel正式发布新一代Atom处理器
- AutoIt的录制(AU3Record)
- 服务器搭建是基于操作系统的,服务器搭建是基于操作系统的
- 一键关机 / 重启脚本
- coco2d-html5制作弹弓射鸟第一部分---橡皮筋
- 数字逻辑计算机组成,数字逻辑设计与计算机组成pdf
- vmware virtual machine must be running in order to be migrated
热门文章
- Nature综述:宏基因组测序研究耐药基因的方法和资源
- 腾讯云轻量8核16G服务器18M带宽CPU流量性能测评
- 第13章-1~3 法兰接头预紧力密封接触分析(模型简化、网格调整、约束)并行计算设置、摩擦接触设置adjust to touch 、约束设置frictionless support、bolt
- java对opengl绑定_你好,JOGL - Java与OpenGl的绑定-Java频道-中国IT实验室
- 网页游戏开发基础——Canvas基本图形绘制
- 高等数学笔记-乐经良老师-第五章-积分(Ⅱ)-定积分的应用-第六节-定积分的应用
- Python编程从入门到实践 动手试一试 代码合集
- java实现按比例缩放图片技巧
- 利用爬虫获取免费IP代理
- 手机与存储卡空间大小剩余怎么获取