一. 1.创建线程: (1)在创建线程时,传入Runnable接口的实现类,重写run方法指定执行任务 (2)使用FutureTask(实现Runnable接口)来指定任务,可以通过get方法来获得执行结果,如果当前还获取不到结果就会阻塞,直到结果返回。 (3)调用start方法只是让线程进入就绪状态,是否可以真正运行run()是由任务调度器决定的。 (4)start和run:不能直接调用run方法,因为这样并不会启动一个新的线程,依旧是在main线程来执行。相当于普通方法的直接调用 2.常见方法: (1)Sleep:写的位置决定作用于哪个线程,其他线程可以通过interrupt来打断处于睡眠的线程,睡醒不一定开始执行,需要轮到你才行,不会释放锁 (2)Interrupt:打断线程,谁来调用就打断哪个线程,可以用来打断在执行阻塞方法的线程(sleep,wait,join),这些方法在被打断之后会清除标记 (3)isInterrupted:判断当前是否有打断标记 (4)Interrupted:判断当前有打断标记,并且清除标记 (5)Park:LockSupport的静态方法,在调用时会 Java并发编程是Java开发中非常重要的一个领域,它涉及到多线程的创建、管理以及同步。本文主要讨论Java并发编程中的关键概念,如线程创建、线程状态、同步机制和锁的使用。 创建线程有多种方式。一种是实现`Runnable`接口并重写`run`方法,然后通过`Thread`类构造器传入这个实现类来创建线程。另一种是使用`FutureTask`,它不仅实现了`Runnable`接口,还提供了获取执行结果的能力,调用`get`方法会阻塞直到结果可用。线程的启动是通过`start`方法,但这仅让线程进入就绪状态,实际运行与否由任务调度器决定。重要的是,不能直接调用`run`方法,因为它不会创建新线程,而是在当前线程中执行。 线程中常见的方法有`sleep`、`interrupt`、`isInterrupted`、`interrupted`、`park`、`yield`、`join`、`wait`和`notify`。`sleep`可以让线程进入等待状态,但不会释放锁。`interrupt`用于中断线程,尤其能打断`sleep`、`wait`和`join`等阻塞状态。`isInterrupted`和`interrupted`分别用于检查和检查并清除中断标志。`park`和`unpark`是`LockSupport`提供的方法,用于线程的阻塞和唤醒控制。`yield`让当前线程自愿放弃CPU时间片,但并不保证其他线程会被立即调度。`join`等待其他线程结束,`wait`和`notify`是对象监视器(Monitor)的一部分,用于线程间同步。 线程优先级在Java中范围是1到10,但其效果依赖于操作系统的调度策略。线程有六种状态:NEW、RUNNABLE、WAITING、TIMED_WAITING、BLOCKED和TERMINATED,它们描述了线程在执行过程中的不同阶段。 `synchronized`关键字用于保证线程安全,它可以修饰方法或代码块,锁定的对象分别为实例或类对象。Java对象头中的Mark Word记录锁状态,Monitor用于管理锁的获取和释放。锁机制有升级过程,从偏向锁(简单地绑定线程)、轻量级锁(自旋锁)到重量级锁(使用Monitor)。锁升级是为了解决频繁加锁解锁带来的性能问题。 ReentrantLock是Java中的一种可重入、可中断、可设置超时的互斥锁,它还支持公平锁和多个条件变量。通过`Lock`方法加锁,`Unlock`方法解锁,使用`newCondition`创建条件变量。 理解这些概念对于编写高效、线程安全的Java代码至关重要。正确地管理和同步线程,可以避免竞态条件、死锁等问题,提高程序的并发性能。同时,合理利用锁升级和锁消除机制,可以在保证线程安全的同时降低系统开销。
- 粉丝: 6316
- 资源: 526
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助