黑马程序员_多线程

本文详细介绍了Android和Java的培训课程,从多线程、同步到线程安全问题及解决方法,再到停止线程和线程类的其他重要方法。内容涵盖了创建线程的方式、线程间的通信技巧,以及如何有效管理线程生命周期,旨在帮助开发者深入理解并掌握Android与Java编程的核心技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------- android培训java培训、期待与您交流! ---------- 

 

多线程

 

创建线程方式一


继承Thread类
1.子类覆盖父类中的run方法,将线程运行的代码存放在run中。


2.建立子类对象的同时线程也被创建。


3.通过调用start方法开启线程。

 

 创建线程方式二


实现Runnable接口
1.子类覆盖接口中的run方法。


2.通过Thread类创建线程,并将实现了Runnable接口的子类对象作为参数传递给Thread类的构造函数。


3.Thread类对象调用start方法开启线程。

 

线程安全问题


导致安全问题的出现的原因:

1.多个线程访问出现延迟。

2.线程随机性 。


注:线程安全问题在理想状态下,不容易出现,但一旦出现对软件的影响是非常大 的。

 

同步(synchronized)
格式:
synchronized(对象)
{
需要同步的代码;
}

同步可以解决安全问题的根本原因就在那个对象上,该对象如同锁的功能。

同步的特点
同步的前提:


1.同步需要两个或者两个以上的线程。


2.多个线程使用的是同一个锁。


未满足这两个条件,不能称其为同步


同步的弊端:
当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形 中会降低程序的运行效率

 同步函数
格式:
在函数上加上synchronized修饰符即可。
思考:同步函数用的是哪个锁呢?(this)

线程间通信


思考1:wait(),notify(),notifyAll(),用来操作线程为什么定义在了Object类中?


1,这些方法存在与同步中。
2,使用这些方法时必须要标识所属的同步的锁。
3,锁可以是任意对象,所以任意对象调用的方法一定定义Object类中。


思考2:wait(),sleep()有什么区别?


wait():释放cpu执行权,释放锁。
sleep():释放cpu执行权,不释放锁

 

 

停止线程


1.定义循环结束标记
因为线程运行代码一般都是循环,只要控制了循环即 可。
2.使用interrupt(中断)方法。
该方法是结束线程的冻结状态,使线程回到 运行状态中来。


注:stop方法已经过时不再使用。

线程类的其他方法
setPriority(int num)  更改线程的优先级。


setDaemon(boolean b)  将该线程标记为守护线程或用户线程。


join()  等待该线程终止


setName(String name) 自定义线程名称   改变线程名称,使之与参数 name 相同。


toString() 返回该线程的字符串表示形式,包括线程名称、优先级和线程组。

yield()
          暂停当前正在执行的线程对象,并执行其他线程。

 

 

 

 

------- android培训java培训、期待与您交流! ---------- 

### 黑马程序员多线程学习笔记与资料 在Java中,多线程是实现并发编程的重要工具。以下是一些关于黑马程序员多线程学习笔记和相关资料的内容总结[^1]。 #### 线程池的工作机制 线程池是一种用于管理和复用线程的机制,能够有效减少线程创建和销毁的开销,提高系统性能。当通过`submit`方法向线程池提交任务时,其工作流程如下: - 客户端每次提交一个任务,线程池会在核心线程池中创建一个工作线程来执行这个任务。 - 如果核心线程池中的线程已满,则尝试将任务存储到工作队列中。 - 如果工作队列也满了,线程池会再次在非核心线程池区域创建新线程来执行任务,直到当前线程池总线程数量达到最大值。 - 当线程池中的线程数量超过最大值时,多余的任务将按照指定的拒绝策略进行处理。 #### 创建线程的方式 在Java中,可以通过以下几种方式创建线程: 1. **继承Thread类**:通过重写`Thread`类的`run`方法实现线程逻辑,并调用`start`方法启动线程。 2. **实现Runnable接口**:定义一个实现了`Runnable`接口的类,并在`run`方法中编写线程逻辑,然后将其传递给`Thread`类的构造函数。 3. **使用Callable和FutureTask**:`Callable`接口类似于`Runnable`,但可以返回结果并抛出异常。结合`FutureTask`可以实现更复杂的线程功能。 4. **使用线程池**:通过`ExecutorService`接口提供的线程池管理功能,简化线程的创建和管理过程。 以下是使用线程池的一个简单示例: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExample { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(5); // 创建一个固定大小的线程池 for (int i = 0; i < 10; i++) { Runnable task = () -> { System.out.println("Task executed by: " + Thread.currentThread().getName()); }; executorService.submit(task); // 提交任务到线程池 } executorService.shutdown(); // 关闭线程池 } } ``` #### 多线程同步与锁 在多线程环境中,多个线程可能同时访问共享资源,导致数据不一致的问题。为了解决这个问题,可以使用同步机制: - **synchronized关键字**:用于修饰方法或代码块,确保同一时间只有一个线程可以访问该方法或代码块。 - **Lock接口**:提供了比`synchronized`更灵活的锁机制,例如可重入锁、读写锁等。 #### 常见问题与解决方案 在多线程编程中,可能会遇到死锁、线程安全等问题。解决这些问题的关键在于合理设计线程间的协作机制,避免竞争条件的发生。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值