多线程与线程池的基本概念与方法

一、多线程

1、什么是多线程?

线程是操作系统调度的最小单元,在一个进程里可以创建多个线程,这些线程拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在多线程中高速切换,达到“同时运行”的效果。

2、多线程的创建方式

  1. 继承Thread类
  2. 实现Runnable接口,重写run()方法
  3. 实现Callable接口,重写call方法

3、线程的启动方式

/**
     * 1、继承Thread
     */
    public void createByThread(){
        Thread thread = new TestThread();
        thread.start();
    }

    /**
     * 2、实现Runnable
     */
    public void createByRunnable(){
        Thread thread = new Thread(new TestRunnable());
        thread.start();
    }

    /**
     * Callable方式
     */
    public String createByCallable() throws ExecutionException, InterruptedException {
        FutureTask<String> futureTask = new FutureTask<String>(new TestCallable());
        Thread thread = new Thread(futureTask);
        thread.start();
        System.out.println(futureTask.get());
        return futureTask.get();
    }

4、线程有什么状态

  • NEW :初始化状态,线程被构建,但没有调用start()方法。
  • RUNNABLE :运行状态,java线程将操作系统中的就绪、运行两个状态统称为运行状态
  • BLOCKED :阻塞状态 ,线程阻塞于锁
  • WAITING:等待状态,线程进入等待状态,此时需要其他线程做出一下动作(通知或者中断)
  • TIME_WAITING:超时等待状态,可以在指定时间自动返回
  • TERMINATED:终止状态,线程已经执行完毕。

5、线程如何终止

  • 设置flag进行控制,线程代码运行完毕
  • 使用stop方法。现在已经过期不建议用,因为不保证线程资源正常释放,通常没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定状态下。
  • 结合interrupt和isInterrupted、interrrupted。
    • 中断可以理解为线程的一个标识位属性,它表示线程是否被其他线程进行了中断操作。其他线程调用interrupt()方法对其进行中断操作。
    • 线程自身通过调用isInterrunpted()方法判断是否被中断,或者调用静态方法Thread.interrupted对当前线程的中断标识进行复位。

二、线程池

1、什么是线程池?

线程池管理多个线程的创建以及销毁,可以预先的创建多个线程,将提交上来的任务合理分配给线程执行。线程池可以降低资源消耗,提高响应速度以及提高线程的可管理性。

2、几种线程池的创建

//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程(保存60s),若无可回收,则新建线程。
ExecutorService executorService =  Executors.newCachedThreadPool();
//创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
ExecutorService executorService2 = Executors.newFixedThreadPool(2);
// 创建一个定长线程池,支持定时及周期性任务执行。
ExecutorService executorService3 = Executors.newScheduledThreadPool(1);
//创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
ExecutorService executorService4 = Executors.newSingleThreadExecutor();

3、线程池的使用

  1. 调用执行器Executors创建线程池
  2. 调用submit()或者execute()方法,传入线程对象
  3. 当不需要执行线程任务时,调用shutdown关闭线程池
System.out.println("=========线程池的使用=========");
//submit底层调用execute方法执行任务
executorService.submit(new TestThread());
//传入Runnable
executorService.execute(new TestRunnable());
//传入Callable 并接收线程返回值
Future<String> future1 = executorService.submit(new TestCallable());
System.out.println("线程池方式启动Callable结果:"+future1.get());
System.out.println("=====关闭线程池======");
executorService.shutdown();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值