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

第三百一十二节 Java线程教程 - Java多线程

Java线程教程 - Java多线程

以下代码显示了如何在程序中运行多线程。

public class Main {public static void main(String[] args) {// Create two Thread objectsThread t1 = new Thread(Main::print);Thread t2 = new Thread(Main::print);// Start both threadst1.start();t2.start();}public static void print() {for (int i = 1; i <= 500; i++) {System.out.println(i);}}
}

上面的代码生成以下结果。

线程同步

Java编程语言内置了两种线程同步:

  • 互斥同步
  • 条件同步

在互斥同步中,在一个时间点只允许一个线程访问代码段。

条件同步通过条件变量和三个操作来实现:等待,信号和广播。

同步关键字

synchronized关键字用于声明需要同步的关键部分。

有两种方法可以使用synchronized关键字:

  • 将方法声明为关键部分
  • 将语句块声明为关键段

我们可以通过在方法的返回类型之前使用关键字synchronized来声明一个方法作为临界段。

public class Main {public synchronized void someMethod_1() {// Method code goes here}public static synchronized void someMethod_2() {// Method code goes here}
}

我们可以声明一个实例方法和一个静态方法同步。构造函数不能声明为同步。

以下代码说明了使用关键字synchronized:

public class Main {public synchronized void someMethod_1() {// only one thread can execute here at a time}public void someMethod_11() {synchronized (this) {// only one thread can execute here at a time}}public void someMethod_12() {// multiple threads can execute here at a timesynchronized (this) {// only one thread can execute here at a time}// multiple threads can execute here at a time}public static synchronized void someMethod_2() {// only one thread can execute here at a time}public static void someMethod_21() {synchronized (Main.class) {// only one thread can execute here at a time}}public static void someMethod_22() {// multiple threads can execute here at a timesynchronized (Main.class) {// only one thread can execute here at a time}// multiple threads can execute here at a time}
}

wait()方法

对wait()方法的调用必须放在synchronized方法或同步块中。

对于当前线程已经获取监视器的对象,必须调用wait()方法。

notify()方法

没有办法唤醒等待集中的特定线程。

例子

public class Main {private static int myValue = 1;public static void main(String[] args) {Thread t = new Thread(() -> {while (true) {updateBalance();}});t.start();t = new Thread(() -> {while (true) {monitorBalance();}});t.start();}public static synchronized void updateBalance() {System.out.println("start:" + myValue);myValue = myValue + 1;myValue = myValue - 1;System.out.println("end:" + myValue);}public static synchronized void monitorBalance() {int b = myValue;if (b != 1) {System.out.println("Balance  changed: " + b);System.exit(1); }}
}

上面的代码生成以下结果。

例2

以下代码显示了上述代码的非同步版本。

public class Main {private static int myValue = 1;public static void main(String[] args) {Thread t = new Thread(() -> {while (true) {updateBalance();}});t.start();t = new Thread(() -> {while (true) {monitorBalance();}});t.start();}public static  void updateBalance() {System.out.println("start:" + myValue);myValue = myValue + 1;myValue = myValue - 1;System.out.println("end:" + myValue);}public static synchronized void monitorBalance() {int b = myValue;if (b != 1) {System.out.println("Balance  changed: " + b);System.exit(1); }}
}

上面的代码生成以下结果。


http://www.mrgr.cn/news/66763.html

相关文章:

  • Python中的PDF处理工具:PyPDF2和ReportLab使用指南
  • 【综合案例】使用React编写B站评论案例
  • 《MySQL 8 DBA基础教程》第一章习题
  • Linux下Java的多种方式安装
  • ubuntu知识点滴积累
  • Python设计模式探究:单例模式实现及应用解析
  • AI 写作(一):开启创作新纪元(1/10)
  • Sourcetree 配置第三方比较工具
  • AI Prompt如何帮你提升论文中的逻辑推理部分?
  • 深⼊理解指针(1)
  • 02- 模块化编程-006 ADC0808数码显示对比
  • 【VScode】调试
  • 号码品牌认证:有效提升企业外呼接通率
  • 腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
  • 【大模型实战项目】基于Langchain与ChatGLM等语言模型的本地知识库问答项目(附教程)
  • go语言环境配置
  • 计算机毕业找什么工作,计算机就业指南(非常详细)零基础入门到精通,收藏这篇就够了
  • 鲲鹏生态繁荣的“幕后推手”:虹信软件扛起“智改数转”大旗
  • 基于Spring Boot的药品管理系统的设计与实现,LW+源码+讲解
  • ssm+jsp653基于Javaweb的网上花店系统的设计与实现
  • 【AIStarter】共创未来:AI赛道一起创业!
  • Mysql海量数据经常有下面这些操作,离被开除就不远了(持续更新)
  • Mysql执行一模一样的语句,一个报错,一个成功
  • rclone挂载后如何优化性能?
  • 【9700】基于springboot+vue的就业信息管理系统
  • Agilent U2004A功率传感器,是德KEYSIGHT U2004A功率探头