线程总结及相关面试笔试题

操作系统中运行的一个程序就是一个进程,线程是进程的组成部分。

1.1线程与进程

1.进程
进程(Process)是计算机程序基于某个数据集合上的一次独立运行活动,是系统资源分配和调度的基本的单位。早期面向进程设计的计算机结构中,进程是程序的基本执行体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令,数据及其组织形式的描述,进程是程序的实体。

特征: (1)一个进程就是一个执行的程序,每个进程都有自己独立的内存空间和系统资源,每个进程的内部数据和状态都完全独立。
(2)创建并执行一个进程的系统开销较大。
(3)进程是程序的一次执行过程,是系统运行程序的基本单位。

2.线程
线程有时候被称为轻量级进程,是程序执行流的最小单元,一个标准的线程由线程ID,当前指令指针和寄存器组合(堆栈)组成。
线程是进程中的一个实体,是被系统独立调用和分配的基本单位,线程自己不拥有系统资源,只拥有少量在运行中不可缺少的资源,他可以与同属于一个进程的其他线程共享进程的全部资源。

区别: (1)同样作为基本的执行单元,线程是比进程更小的执行单元。
(2)每个进程都有一段专用的内存区域,而线程则共享内存单元,通过共享内存单元实现数据交换,实时通信等。

1.2线程的创建

1.继承Thread类的创建
通过继承Thread类,并重写其run()方法,run()方法即线程执行任务。创建后的子类通过调用start()方法即可执行线程方法。
通过继承Thread类实现的线程类,多个线程之间无法共享线程类 的实例变量。

/**
*通过继承Thread类实现线程
*/
public class ThreadTest extends Thread{
       private int i=0;
       @Override
      public void run(){
         for(;i<50;i++){
   System.out.println(Thread.currentThread().getName():+"is running"+i);
           }
      }
    public static void main(String[] args){
          for(int j=0;j<50;j++){
				if(j==20){
					new ThreadTest().start();
					new ThreadTest().start();
					}
        }
    }
}

2.通过Runnable接口创建线程类
先定义一个类,实现Runnable接口,并重写该接口的run()方法,此run()方法是线程执行体,接着创建Runnable实现类的对象。通过Runnable实现接口的线程类,是互相共享资源的。

3.使用Callable和Future创建线程
上述两种方法不能有返回值,并且不能声明抛出异常,而Callable接口可以,其提供的call()方法作为线程的执行体,同时允许有返回值。
但是Callable对象不能直接作为Thread对象的target,需要引入Duture接口,此接口可以接受call方法的返回值,RunnableFuture接口可以做Thread对象的target。

**

1.3线程的生命周期

(1)创建态:当一个Thread类或其子类的对象被声明创建时,新生的线程处于创建状态。
(2)就绪态:创建态的线程执行start()方法后,进入线程队列等待CPU时间片,即具备运行条件但没有分配到CPU的状态。
(3)运行态:就绪态的线程获得CPU后进入运行态,run()方法定义了线程的操作。
(4)阻塞态:在某种情况下,被人为挂起或者等待I/O时让出CPU终止执行,进入阻塞态。
(5)终止态:执行完操作或者被强制终止或者出现异常会进入终止态。

1.4线程同步机制

线程的同步主要用于协调对临界资源的访问

有临界区,互斥量,事件,信号量四种机制。

各同步机制的功能:
(1)临界区是一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问。如果有多个进程同时访问临界区,那么在一个线程进入后,其他所有试图访问的进程都会被挂起直到进入临界区的线程离开。临界区被释放后,其他线程才可以继续抢占。
(2)互斥量可用于不同进程之间的线程同步。 (3)对于事件而言,在互斥量的基础上多了个前置条件,能保证一个线程对一个资源的独占访问。
(4)信号量用于限制对临界资源的访问数量。

1.5线程的调度

计算机通常只有一个CPU,在任意时刻只能执行一条机器指令,每个线程只有获得CPU才能执行指令。所谓的多线程并发运行其实是指各个线程轮流获得CPU的使用权,分别执行各自的任务。
一般有两种调度模型:分时调度与抢占式调度。Java的调度不是分时的,同时启动多个线程后不能保证各个线程轮流获得CPU。可用sleep(),yield()方法调整优先级。

面试、笔试题

1.介绍死锁,活锁与饥饿

2.Java中用到的线程调度算法是什么?
3.什么是多线程的同步与互斥?如何实现?
4.怎么唤醒一个阻塞的线程?
5.如何启动一个线程?用run()还是strat()?
6.notify()与notifyAll()的区别?
7.乐观锁和悲观锁的含义?如何实现?
8.什么是线程安全?
9.线程设计?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z小脏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值