jianglilili / jianglilili/guodegang.github.io

线程杂碎

Open
#34 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
No language data
Stars
0
Forks
0
PR merge metrics
No merged PRs in 30d

Description

**java提供了三种创建线程的方法:**
- 通过实现Runnable接口
- 通过继承Thread类本身
- 通过Callable和Future创建线程

**线程的几个主要概念**
在多线程编程时,需要了解以下几个概念:
- 线程同步
- 线程间通信
- 线程死锁
- 线程控制:挂起、停止和恢复

**多线程的使用**

- 有效利用多线程的关键是理解程序是并发执行而不是串行执行的。例如:程序中有两个子系统需要并发执行,这时候就要利用多线程编程。
通过对多线程的使用,可以编写出非常高效的程序。不过,如果创建太多的线程,程序执行的效率实际上是降低了,而不是提升了。
谨记,上下文的切换开销也很重要,如果创建了太多的线程,CPU花费在上下文的切换的时间将多于执行程序的时间!

**run()方法和start()方法**

- 通过run方法调用并不会创建新的线程,而是在主线程中直接运行run方法,跟普通的方法调用没有任何区别;
- 新线程创建的过程不会阻塞主线程的后续执行。

**sleep和wait的区别:**

- sleep是Thread类的方法,wait是Object类中定义的方法.
- Thread.sleep不会导致锁行为的改变, 如果当前线程是拥有锁的, 那么Thread.sleep不会让线程释放锁.
- Thread.sleep和Object.wait都会暂停当前的线程. OS会将执行时间分配给其它线程. 区别是, 调用wait后, 需要别的线程执行notify/notifyAll才能够重新获得CPU执行时间.

**多任务运行过程的示意图:**
![image](https://user-images.githubusercontent.com/46592435/53695650-395c1d80-3df9-11e9-9e9f-bbbae6990e52.png)
**单线程与多线程的关系:**
![image](https://user-images.githubusercontent.com/46592435/53695735-30b81700-3dfa-11e9-8a78-11468105c26e.png)

- 任务执行的一小段时间叫时间片

- 任务正在执行时的状态叫运行状态

- 程序是运行于操作系统之上的

- 进程一般由程序、数据集合和进程控制块三部分组成

- 任务调度采用的是时间片轮转的抢占调度方式

- 线程是处理器调度和分派的基本单位

**进程具有的特征**
- **动态性**:进程是程序的一次执行过程,是临时的,有生命期的、是动态产生的,动态消亡的
- **并发性**:任何进程都可以同其他进程一起并发执行
- **独立性**:进程是系统进行资源分配和调度的一个独立单位
- **结构性**:进程是由程序,数据和进程控制块三部分组成

**线程的生命周期**

- **创建**:一个新的线程被创建,等待该线程被调用执行
- **就绪**:时间片已用完,此线程被强制暂停,等待下一个属于他的时间片到来
- **运行**:线程正在执行,正在抢占时间片
- **阻塞**:也叫等待状态,等待某一个事件(如IO或另一个线程)执行完
- **退出**:一个线程完成任务或者其他终止条件发生,该线程进入退出状态,退出状态释放该线程所分配的资源

- 程序从一开始就有一个默认的线程,被称为主线程,只有一个线程的程序被称为单线程程序

- main本身就是一个线程(主线程),单个线程从头执行到尾

- Java给多线程程序提供了内置的支持,提供了两种创建线程的方法:1.通过实现Runnable接口;2.通过继承Thread

- Thread类本身实现了Runnable接口,所以Runnable是显示创建线程必须实现的接口,Runnable只有一个run()方法,所以不管通过哪种方式创建线程,都必须实现run()方法

**synchronized**

- 在定义接口方法时不能使用synchronized关键字
- 构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步
- 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它去的的锁是对象;如果synchronized作用的对象是一个静态的方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁
- 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它锁控制的那段代码
- 实现同步是要很大的系统开销作为代价的,基本可能造成死锁,所以尽量避免无谓的同步控制

**currentThread()方法**

- currentThread()方法可以返回代码段正在被哪个线程调用的信息
```
public class Run1
{
public static void main(String[] args)
{
System.out.println(Thread.currentThread().getName());
}
}
```

- 如果线程是因为使用了sleep()或wait()方法进入了就绪状态,这是可以使用Thread类中的interrupt()方法使线程离开run()方法,同时结束进程,但程序会抛出InterruptException异常

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.