Java多线程

1.线程和进程的区别:

线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

执行过程:每个独立的进程有程序运行的入口. 顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

线程的创建

4种。

  1. 继承Thread类。

public class MyThread extends Thread {

    public void run() {
        for(int i = 0; i < 10; i++) {
            System.out.println("MyThread"+getName());
        }
    }

}
public static void main(String[] args) throws InterruptedException {
    /**
     * 多线程的第一种启动方
     * 1.定义一个类继承Thread
     * 2.重写run方法
     * 3.创建子类对象启动线程
     */
    MyThread T1 = new MyThread();
    MyThread T2 = new MyThread();
    //开启线程.start()
    T1.setName("T1");
    T2.setName("T2");

    T1.start();
    T2.start();

}
  1. 使用Runnable接口。

public class Run implements Runnable{
    @Override
    public void run() {
        //实现线程要执行的代码
        for(int i = 0; i < 10; i++) {
            System.out.println("MyThread"+Thread.currentThread().getName()+"              "+i);
        }
    }
}
/**
 * 多线程的第二种启动方
 * 1.自己定义一个实现Runnable接口的类
 * 2.重写run方法
 * 3.创建自己的类
 * 4.创建一个Tread类对像开启多线程
 */

//创建Run的对象
//表示多线程要执行的人物


public static void main(String[] args) {

    Run r = new Run();

    Thread t1 = new Thread(r);
    Thread t2 = new Thread(r);
    t1.start();
    t2.start();

}
  1. 使用Callable接口。

public class Mycallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        //求1~100d的和
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }


        return sum;
    }
}
  1. 使用线程池技术。

DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。

CallerRunsPolicy:由调用线程处理该任务。

工作中核心线程数设置与CPU有关系,核心线程数=CPU数*2

但是这样创建不够灵活,可以通过ThreadPoolExecutor去创建线程池,需要设置7个参数,分别是:

1.核心线程池 2.最大线程数 3.空闲线程存活时间 4.存活时间单位 5.工作队列 6线程工厂 7.拒绝策略

拒绝策略有4种:

AbortPolicy:丢弃任务并且抛出异常。

DiscardPolicy:丢弃任务但是不抛出异常。

  1. 可以通过Executors类提供的方法创建线程池,有4种创建的方法:

  2. 创建一个可以缓存的线程池。

  3. 创建一个定长的线程池。

  4. 创建一个定长的,支持定时任务、周期任务执行的线程池。

  5. 创建一个单线程池。

工作中一般用线程池的方式来创建线程,方便线程的管理。比如SpringBoot中异步方式的执行,底层采用的就是线程池的方式。

线程总共有5种状态:

  1. 新建状态:当线程对象创建后,进入新建状态。

  2. 就绪状态:当调用线程对象的start()方法时,进入就绪状态。

  3. 运行状态:当CPU开始调度就绪状态的线程时,进入运行状态。

  4. 堵塞状态:当运行的线程由于某些原因暂时放弃对CPU的使用权,进入堵塞状态。

  5. 死亡状态:当线程执行完毕或由于异常退出了run()方法,线程结束生命周期。

堵塞的情况有3种:

  1. 等待阻塞:运行状态的线程执行了wait()方法。

  2. 同步阻塞:线程在获取sync锁的时候失败。(因为锁被其他线程占用)

  3. 其他阻塞:通过调用线程的sleep()或者join()或发出了I/O请求时。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值