线程中有4种创建方式?
1.继承 Thread
2.实现 Runnable 接口
3.实现 Callable 接口
4.使用线程池 (设置线程数量)
其实还有一个lambda表达式,不过基本上用不到的;
目录
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 : 拒接策略