面试题中有可能出现的线程问题?

线程中有4种创建方式?

1.继承 Thread 

2.实现 Runnable 接口

3.实现 Callable 接口

4.使用线程池 (设置线程数量)

    其实还有一个lambda表达式,不过基本上用不到的;

目录

线程中有4种创建方式?

1.继承 Thread 

2.实现 Runnable 接口

3.实现 Callable 接口

4.线程池

线程之间的区别

线程的六中状态

线程的生命周期五状态

线程池的七大参数

1.继承 Thread 

创建线程方式:
class Mythread extends Thread{   //必须继承线程   这种方式比较单一
    // 重写run方法
    public void run(){
        ....
    }       
}

public class Thread01{
    ...
        Mythread m =new Mythread();  // 调用线程
    m.start();  // 启动线程
}

2.实现 Runnable 接口

    
class Mythread implements Runnable{
    
    public void run(){}   	//重写 run() 方法
 
}  
  
public class TestThread{
    ...
        Thread t =new Thread();
    t.start();	// 启动线程
}   

推荐使用:

       避免了单继承的局限性,灵活方便,实现的方式更适合来处理多个线程有共享数据的情况

3.实现 Callable 接口

public Mythread implements Callable{
    
    public Object call() throws Exception(){}    // 实现抽象方法call() 方法
    return null;
}    
 public class ThreadTest{
     ...
         Mythread m =new Mthread();		// 创建实体类
     FutureTask futureTask =new FutureTask(m);	//将此对象作为参数传剃到uture
     Thread t =new Thread(futureTask);	//将futureTask 放到线程
     t.start;
 }   

不常用的方式:

         callable() 可以有返回值   可以抛出异常,被外面的操作捕获,获取异常信息,   支持泛型

4.线程池

执行指定的线程的操作,需要提供实例Runnable 或Callable 接口实现类对象

public Mythread implements Runnable{
    public void run(){        // 重写 run 方法
        ....
    }		
}    
    
public class TestThread{
    ...			// 提供指定的线程数量的线程池
   ExecutorService service =Executors.newFixedThreadPool(10);
    service.execute(new Mythread());		//适用于 Runnable
   
    //service.execute(Callable callable);    适用于callable
    service.shutdown();	//关闭线程    
}

线程间的区别:

为什么很少用到线程池?
    要预估线程池的线程数量: 如果线程太多了: 会浪费大量时间在上线文切换上

        如果线程太少了: 处理器的性能无法充分使用

Runnable 跟 Collable 之间的区别?

     Runnable 是没有返回值的 

      Collable 是有返回值的

线程的六中状态

1.New 新建状态
    线程刚被创建,start 方法之前的状态
2.Runnable  运行状态
    的到时间片运行中的状态, (Ready 就绪,未的到时间片就绪状态)
3.Blocked 阻塞状态   
    如果遇到锁,线程就会变成阻塞状态等待另一个线程方锁
4.Waiting  等待状态  
5.Time_Watiting   超时等待状态
6.Terminated   终止状态 

    点线程结束完成之后就会变成此状态

线程的生命周期五状态

生命周期的5个状态:
1.创建状态 (new)
2.就绪状态 (Runnable)
3.运行状态 (Running)
4.阻塞状态 (Blocked)  
5.死亡状态 (Dead) 

     

       当new 一个线程后,该线程处于新建状态,会是初始化成员变量;
此时线程对象没有表现出任何的动态特征,程序也不会执行线程的执行体;
    
     如果处于就绪状态的线程就获的了cpu,开始执行run方法的线程执行体,则该线程处于运行状态;线程运行机制:


    一个线程运行后,他不可能一直处于运行状态,线程在运行过程中需要中断,目的是让其他的线程有运行的机会,线程的调度取决于底层的策略;  

      线程从阻塞状态只能进入就绪状态,如法进入运行状态; 而就绪和运行之间的转换通常不受程序控制,而是由系统调度所致的;  

      当就绪状态的线程获得资源时,该线程就会进入运行状态,当运行状态的线程是请求处理资源时就进入了就绪状态;    
    
    当主线程结束的时候,其他线程不受任何影响,一旦子线程启动后,会拥有和主线程相同的地位,不受主线程影响; 死忙线程不可能在此运行;

线程池的七大参数

  1. corePoolSize  : 核心线程数
  2. maximumPoolSize  : 最大线程数
  3.  keepAliveTime  : 空闲线程数
  4.  unit : 时间单位
  5.  workQueue  : 工作队列
  6.  threadFactory  :  线程工厂 
  7.  handler  : 拒接策略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值