如何理解 Java 线程的概念及线程的创建和管理,包括 Runnable 接口和 Thread 类

多线程编程是现代软件开发中的重要技术,能够显著提高程序的效率和响应速度。Java 提供了丰富的多线程编程支持,使开发者可以轻松地创建和管理线程。

1. 线程的基本概念
1.1 进程与线程
  • 进程:是操作系统中独立运行的程序,每个进程都有自己的内存空间和系统资源。
  • 线程:是进程中的一个执行单元,一个进程可以包含多个线程。线程共享进程的内存空间和资源,但每个线程有自己的执行路径。
1.2 多线程的优点
  • 提高程序响应速度:在 GUI 应用程序中,使用多线程可以保持界面的响应能力。
  • 充分利用多核处理器:多线程可以在多核处理器上并行执行,提高程序性能。
  • 简化异步编程:多线程使处理异步任务变得更加容易。
2. 创建线程

Java 提供了两种主要方式来创建线程:实现 Runnable 接口和继承 Thread 类。

2.1 实现 Runnable 接口

实现 Runnable 接口是创建线程的推荐方式,因为它避免了 Java 的单继承限制,并且更符合面向对象设计原则。

步骤:

  1. 定义一个类实现 Runnable 接口。
  2. 实现 Runnable 接口的 run 方法。
  3. 创建 Thread 对象,并将 Runnable 实现类的实例作为参数传递给 Thread 的构造函数。
  4. 调用 Thread 对象的 start 方法启动线程。

示例代码:

class MyRunnable implements Runnable {@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + " - " + i);try {Thread.sleep(1000);  // 休眠1秒} catch (InterruptedException e) {e.printStackTrace();}}}
}public class RunnableExample {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread1 = new Thread(myRunnable, "Thread-1");Thread thread2 = new Thread(myRunnable, "Thread-2");thread1.start();thread2.start();}
}
2.2 继承 Thread 类

继承 Thread 类是另一种创建线程的方法,但由于 Java 是单继承语言,这种方法在类需要继承其他类时不太适用。

步骤:

  1. 定义一个类继承 Thread 类。
  2. 重写 Thread 类的 run 方法。
  3. 创建 Thread 子类的实例。
  4. 调用实例的 start 方法启动线程。

示例代码:

class MyThread extends Thread {@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println(getName() + " - " + i);try {Thread.sleep(1000);  // 休眠1秒} catch (InterruptedException e) {e.printStackTrace();}}}
}public class ThreadExample {public static void main(String[] args) {MyThread thread1 = new MyThread();MyThread thread2 = new MyThread();thread1.setName("Thread-1");thread2.setName("Thread-2");thread1.start();thread2.start();}
}
3. 线程管理
3.1 线程生命周期

线程有以下几种状态:

  • 新建(New):线程对象被创建但未启动。
  • 就绪(Runnable):线程已启动,等待 CPU 调度。
  • 运行(Running):线程正在执行。
  • 阻塞(Blocked):线程因某种原因暂停执行,等待资源。
  • 死亡(Terminated):线程执行结束或异常终止。
3.2 线程的优先级

每个线程都有优先级,优先级较高的线程将更早被 CPU 调度执行。可以使用 setPriority 方法设置线程的优先级,范围从 1 到 10。

Thread thread = new Thread(new MyRunnable());
thread.setPriority(Thread.MAX_PRIORITY);  // 设置最高优先级
3.3 线程同步

线程同步用于解决多个线程并发访问共享资源时可能引起的数据不一致问题。Java 提供了多种同步机制。

3.3.1 同步方法

使用 synchronized 关键字修饰方法,使该方法在同一时间只能被一个线程执行。

class Counter {private int count = 0;public synchronized void increment() {count++;}public int getCount() {return count;}
}public class SynchronizedMethodExample {public static void main(String[] args) {Counter counter = new Counter();Runnable task = () -> {for (int i = 0; i < 1000; i++) {counter.increment();}};Thread thread1 = new Thread(task);Thread thread2 = new Thread(task);thread1.start();thread2.start();try {thread1.join();thread2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Final count: " + counter.getCount());}
}
3.3.2 同步代码块

使用 synchronized 关键字修饰代码块,指定锁对象,以更细粒度地控制同步。

class Counter {private int count = 0;private final Object lock = new Object();public void increment() {synchronized (lock) {count++;}}public int getCount() {return count;}
}public class SynchronizedBlockExample {public static void main(String[] args) {Counter counter = new Counter();Runnable task = () -> {for (int i = 0; i < 1000; i++) {counter.increment();}};Thread thread1 = new Thread(task);Thread thread2 = new Thread(task);thread1.start();thread2.start();try {thread1.join();thread2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Final count: " + counter.getCount());}
}
3.4 线程通信

线程通信用于在线程之间传递信息,Java 提供了 waitnotifynotifyAll 方法来实现线程通信。

3.4.1 wait 和 notify
  • wait:使当前线程等待,直到另一个线程调用 notifynotifyAll 方法。
  • notify:唤醒等待的线程中优先级最高的线程。
  • notifyAll:唤醒所有等待线程。

示例代码:

class SharedResource {private int value = 0;private boolean available = false;public synchronized void produce(int newValue) {while (available) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}value = newValue;available = true;System.out.println("Produced: " + value);notify();}public synchronized void consume() {while (!available) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("Consumed: " + value);available = false;notify();}
}public class WaitNotifyExample {public static void main(String[] args) {SharedResource resource = new SharedResource();Thread producer = new Thread(() -> {for (int i = 1; i <= 10; i++) {resource.produce(i);}});Thread consumer = new Thread(() -> {for (int i = 1; i <= 10; i++) {resource.consume();}});producer.start();consumer.start();}
}
4. 高级多线程技术
4.1 线程池

线程池是一组预先创建的线程,可以重复使用,避免频繁创建和销毁线程带来的性能开销。Java 提供了 java.util.concurrent 包中的 ExecutorService 接口和相关实现类来管理线程池。

示例代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(3);Runnable task = () -> {System.out.println(Thread.currentThread().getName() + " is executing task.");try {Thread.sleep(1000);  // 模拟任务执行时间} catch (InterruptedException e) {e.printStackTrace();}};for (int i = 0; i < 10; i++) {executor.submit(task);}executor.shutdown();  // 关闭线程池}
}
4.2 Callable 和 Future

Callable 接口类似于 Runnable,但可以返回结果并且可以抛出异常。Future 用于表示异步计算的结果。

示例代码:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class CallableFutureExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(3);Callable<String> task = () -> {Thread.sleep(1000);  // 模拟任务执行时间return Thread.currentThread().getName() + " has completed task.";};Future<String> future = executor.submit(task);try {System.out.println(future.get());  // 获取任务结果} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}executor.shutdown();  // 关闭线程池}
}
4.3 并发集合

Java 提供了一些线程安全的集合类,如 ConcurrentHashMapCopyOnWriteArrayListCopyOnWriteArraySet 等。

示例代码:

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;public class ConcurrentMapExample {public static void main(String[] args) {ConcurrentMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();concurrentMap.put("A", 1);concurrentMap.put("B", 2);Runnable task = () -> {concurrentMap.put("C", 3);System.out.println(Thread.currentThread().getName() + " put C: " + concurrentMap.get("C"));};Thread thread1 = new Thread(task);Thread thread2 = new Thread(task);thread1.start();thread2.start();try {thread1.join();thread2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Final map: " + concurrentMap);}
}
5. 线程安全问题与解决方案
5.1 线程安全问题

线程安全问题通常发生在多个线程并发访问共享资源时,导致数据不一致。常见问题包括竞态条件、死锁、饥饿和活锁。

5.2 解决方案
  • 使用同步机制:如 synchronized 关键字、显式锁(java.util.concurrent.locks.Lock)。
  • 使用线程安全类:如 java.util.concurrent 包中的线程安全集合类。
  • 避免共享资源:通过减少共享资源的使用,降低出现线程安全问题的概率。

Java 多线程编程提供了丰富的工具和类,使开发者可以灵活地创建和管理线程,从而提高程序的性能和响应能力。

通过了解线程的基本概念、创建线程的方法、线程的生命周期以及线程同步和通信机制,可以有效地解决并发编程中的各种问题。

随着 java.util.concurrent 包的引入,Java 多线程编程变得更加高效和易用,进一步提升了并发编程的开发体验。

黑马程序员免费预约咨询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型页面

自己做的AI&#xff0c;模仿GPT。 访问地址&#xff1a;欢迎 请大家给点意见&#xff0c;需要追加哪些功能。

Windows下设置pip代理(proxy)

使用场景 正常网络情况下我们安装如果比较多的python包时&#xff0c;会选择使用这种 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-hostpypi.tuna.tsinghua.edu.cn 国内的镜像来加快下载速度。 但是&#xff0c;当这台被限制上…

【python】修改目标检测的xml标签(VOC)类别名

需求&#xff1a; 在集成多个数据集一同训练时&#xff0c;可能会存在不同数据集针对同一种目标有不同的类名&#xff0c;可以通过python脚本修改数据内的类名映射&#xff0c;实现统一数据集标签名的目的。 代码&#xff1a; # -*- coding: utf-8 -*- # Time : 2023/9/11 1…

出海APP遭遇大流量攻击的应对与防御策略

随着全球化的加速&#xff0c;越来越多的中国企业选择将APP推向海外市场。然而&#xff0c;这也意味着他们将面临更加复杂多变的网络安全环境&#xff0c;其中大流量DDoS攻击便是常见且破坏力巨大的威胁之一。本文将深入探讨出海APP遭遇大流量攻击的识别、应急处理及长期防御策…

osi七层网络模型安全加固

应用层加固 应用层的攻击&#xff1a; 1、针对应用层协议的攻击&#xff1a;HTTP攻击、DNS攻击、电子邮件攻击等&#xff0c;利用应用层协议的漏洞&#xff0c;构造恶意数据包&#xff0c;是目标服务器执行恶意代码或暴露敏感信息 HTTP攻击&#xff1a;XSS、CSRF、HTTP头注入…

你每天都在用的APP,原来都是Python写的!

&#x1f446;点击关注 获取更多编程干货&#x1f446; 要说Python的用途&#xff0c;那可太多了&#xff0c;也许你不知道Python是什么&#xff0c;但你一定用过它开发的产品&#xff0c;就像你可能不了解汽车引擎的构造&#xff0c;但你每天都享受着汽车带来的便利一样。 比…

stm32-DMA转运数据

在配置前要记得先定义一下DMA转运的源端数组和目标数组两个数组哦。 接下来我们就开始准备配置吧 配置 初始化 1.RCC开启时钟&#xff08;开启DMA的时钟&#xff09; void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) 作用&#xff1a;开启时…

如何在Weblogic环境中启动认证方式对接Zabbix监控

在WebLogic Server中&#xff0c;启动认证可用于确保只有经过授权的用户和系统能够访问WebLogic Server及其应用程序&#xff0c;通过合理配置认证提供者和安全领域&#xff0c;管理员可以有效管理和控制用户访问。 本文将详细介绍如何在Weblogic环境中配置启动认证并对接Zabb…

用域名访问的网站一定要用OV SSL证书

一、什么是域名 域名&#xff0c;英文名为Domain Name&#xff0c;是互联网上用于识别和定位计算机的层次结构式的字符标识符&#xff0c;通过一系列的字符和点来表示&#xff0c;用于在数据传输时标识计算机的电子方位。简单来说&#xff0c;域名就是网站在互联网上的地址&am…

Django视图层探索:GET/POST请求处理、参数传递与响应方式详解

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

【源码】源码物品销售系统多种支付接口出售源码轻松赚钱

源码物品销售系统&#xff0c;多种支付接口&#xff0c;出售源码轻松赚钱。一款基于phpmysql开发的内容付费管理系统。系统支持多种收费方式&#xff0c;免签收款&#xff0c;三级分销&#xff0c;实名认证&#xff0c; 用户投稿/奖励&#xff0c;自动升级&#xff0c;佣金提现…

python中的循环控制语句break与continue

学习这两个语句之前&#xff0c;我们要先了解这两个语句是什么意思&#xff1a; break&#xff1a;中断、打破的意思。所以它的跳出循环的意思 continue&#xff1a;继续的意思&#xff0c;意思是跳过当前条件&#xff0c;继续循环 新需求来了&#xff01;我们不仅要告诉 Py…

Spark SQL - 操作数据集

本教程将通过一个具体的案例来演示如何在Spark SQL中操作数据集。我们将从创建本地文件开始&#xff0c;然后上传到HDFS&#xff0c;并使用Spark Shell启动Spark程序。接下来&#xff0c;我们将加载数据为DataSet&#xff0c;并给DataSet添加元数据信息。最后&#xff0c;我们将…

ChineseChess.2024.06.03

ChineseChess.2024.06.03 中国象棋&#xff0c;我下得不是象棋&#xff0c;是娱乐&#xff0c;是想看看自己的程序。哈哈 看很多主播挂棋局&#xff0c;吹牛批&#xff0c;为了涨粉&#xff0c;挂着&#xff0c;蛮摆个残局 中国象棋残局模拟器ChineseChess.2024.06.03

RabbitMQ(Direct 订阅模型-路由模式)的使用

文章目录 RabbitMQ&#xff08;Direct 订阅模型-路由模式&#xff09;一&#xff0c;Direct 订阅模型-路由模式介绍&#xff08;Routing&#xff09;二&#xff0c;使用1.添加依赖2.修改配置文件3.创建配置类4.注入RabbitMQ模版引擎5.消息的发送6.消息的接收(监听)7.设置回调函…

谁将决战上海滩,决定权在你手里

关注我们 - 数字罗塞塔计划 - 5月6日雨轩兰台的《【大比武01】AIGC赋能档案文创设计的尝试》&#xff0c;打响了“华夏伟业”杯第二届大比武活动的第一枪&#xff0c;截止到5月31日&#xff0c;入选的10篇优质内容已全部揭晓&#xff0c;好评如潮。感谢雨轩兰台、微柏软件、昀…

三种常见的报表模板,省时又方便

前言 在业务应用和数据分析中&#xff0c;报表是一种常见的数据展示形式&#xff0c;可以帮助用户更直观地理解和解读数据。然而&#xff0c;每次创建和设计一款报表都需要花费大量的时间和精力。为了提高报表设计的效率&#xff0c;本文小编以葡萄城公司的嵌入式BI工具——Wy…

webf 开发工具:数据库持久层基础文件生成工具

WZW.SqlMapHelpForJava是运行在.Net Framework4.0上的数据库持久层基础文件生成工具&#xff0c;支持多种关系型数据库的持久层基础文件、Java类的生成以及对配置文件的更新&#xff0c;与webf框架进行紧密配合&#xff0c;减少了数据库持久层基础文件编写工作量&#xff0c;提…

关于家储用防逆流电流互感器AKH-0.66/K K-φ16 100A/40mA详细介绍-安科瑞 蒋静

1.产品特点 产品外形美观&#xff0c;安装、接线方便&#xff0c;专用于通讯机房 100A 及以下配电系统改造&#xff0c;可与 AMC16 多回路监控仪表配合使用。 2.型号说明 3.外形尺寸(公差&#xff1a;2mm) 4.规格参数对照表 5.使用环境 &#xff08;1&#xff09;额定工作…

SPME2024开幕在即,深兰科技商用清洁机器人新品推介会蓄势待发

6月5日&#xff5e;7日&#xff0c;以“跨界融合洞见未来”为主题的“2024 SPME第六届上海国际物业管理产业博览会”(以下简称“物博会”)将在上海世博展览馆举行。应主办方邀请&#xff0c;深兰科技携多款AI清洁机器人亮相本届展会&#xff0c;向来自全球各地的观展企业家、经…