线程基础
•发布于   •作者 no alone  •306 次浏览  •来自 资讯

线程的概念

1. 进程.相对于应用程序而言是活动的应用程序.是一个动态的概念.

2. 应用程序.由指令和数据组成的有机集合体.它是一个静态的概念.指安装在磁盘上的那些文件.

在代码中使用Thread有3种方式:

1. 继承Thread(重要)

2. 实现Runnable(重要+重要)->线程池

3. 实现Callable(普通)

线程中的常用方法:

1. start 启动一个线程

2. setName() 给线程设置一个名称

3. Thread.sleep();线程类的静态方法.让当前线程休眠指定的时间.时间是毫秒单位.

4. 构造方法

1. 无参构造

2. 带有一个String参数的.这个String参数将作为线程的名称

3. 带有Runnable作为参数.

5. getName()获取线程的名称

6. setPriority() 设置优先级.线程是有优先级的.优先级取值范围是1-10

其中针对最大值,最小值和默认值提供了3个常量分别是:

    public final static int MIN_PRIORITY = 1; 

    public final static int NORM_PRIORITY = 5;    

    public final static int MAX_PRIORITY = 10;

需要注意的是最大值为10不可以赋值超过这个上限.如果超过会产生非法参数异常.关于取值有以下几点需要注意

1. 主线程默认是5.

2. 创建的新线程它的优先级和创建它的线程一致.

7. setDaemon(boolean) 设置守护线程.守护线程的概念来自于守护进程.作用可以保证应用不死.需要注意的守护线程往往是低级线程.比如Java虚拟机就位于低级线程.

8. getState() 获取线程的状态.

9. Thread.currentThread() 获取当前线程对象.用于非Thread类中比如Runnable,Callable就需要使用.

使用继承Thread来创建线程的流程:

1. 提供一个类继承Thread

2. 重写run方法.

3. 提供其它方法.

线程的周期和状态切换

在Thread类中通过枚举(一个特殊的类)State中定义了线程的几个状态

1. New   新建

2. RUNNABLE  就绪

3. BLOCKED   阻塞

4. WAITING   等待

5. TIMED_WAITING  等待(但有时间限制.比如Thread.sleep(1000)固定等待多少时间.时间到了就不再等待)

6. TERMINATED 运行结束

平时会把两个等待以及阻塞合并.称线程的周期为以下5个:

1. New 新建

2. RUNNABLE     就绪

3. RUNNING      运行

4. BLOCKED      阻塞(包含上面的3个内容.block waiting time_waiting)

5. DEATH        死亡.

在线程的这几个状态中有几点需要注意:

1. 当run方法执行结束线程自然死亡.如果该线程不是线程池中的线程不可以被重新启动

2. 能够进入运行时的只有就绪.当线程处于就绪状态时等待cpu分配时间片段.当cpu给了时间片段线程会由就绪转入运行.

3. 运行期间如果时间片段使用完成但是内存却没有执行完成.线程会有运行时转入就绪等待cpu的下一次时间分配.

4. 如果在运行时遇到阻塞比如调用sleep方法.sleep是定时阻塞时间结束会重回到就绪.还有比如读写.java中io是阻塞.读的时候不可以写.那只有等待阻塞的内容完成才可以由阻塞状态回到就绪状态.总之不可以由阻塞直接进入运行时.所有非运行时状态(除了死亡)想要运行都要先进入就绪.

线程的执行是随机的.

线程访问资源的方式:

在内存中存在主内存(就是平时分配空间的地方).每个线程都拥有自己的工作内存.线程访问主内存中的资源可以理解为就是线程中的工作内存和主内存进行数据交互.比如主内存中创建1个变量i 如果线程想访问这个i等于在线程的工作内存中拷贝i的副本.那么线程对i的所有操作都是针对线程中的工作内存中的i.如果对工作内存的i做了改变主内存中的i是不受影响的.必须要等到工作内存把修改后的值回传给主内存.主内存才会做修改.整个交互流程可以为8个步骤

1. lock    主内存中共享资源空间上锁.(对于其它线程来说该资源可见,但是无法访问.可见性是一定要保持的.)

2. load    工作内存从主线程将共享资源的副本load下来.

3. read    工作内存从load中读取共享资源的副本

4. use     工作内存使用读取下来的资源

5. assign  工作内存对资源进行赋值.

6. write   工作内存将资源回写到主内存.

7. store   主内存对新的值进行存储

8. unlock  主内存对共享资源进行解锁.其它的线程这个时候可以访问了.

资源在内存中针对线程可以分为两种:

1. 线程共享

2. 线程不共享 : 比如每个线程的工作内存.比如每个线程中都有的计数器(用于记录当前线程执行到哪里.).

Java中使用锁来完成对资源的上锁和解锁有2种方式

1. synchronized

1. 锁对象

2. 锁方法

2. lock(扩展.)

Lock lock = new ReentrantLock();//还有读写锁

lock.lock();

lock.unlock();

锁对象使用方式为

synchronized (要被锁定的对象.(共享资源)) {

}


0 回复
回到顶部

©2017 Powered by 三十三行伪代码
皖ICP备17005175号-3