0
点赞
收藏
分享

微信扫一扫

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

晚熟的猫 2022-03-11 阅读 79
java
操作系统中运行的一个程序就是一个进程,线程是进程的组成部分。

1.1线程与进程

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

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

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.5线程的调度

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

面试、笔试题

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

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

举报

相关推荐

0 条评论