初识多线程

1.1进程和多线程概述
1.1.1 进程:操作系统结构的基础,一次程序的执行,是系统进行资源分配和调度的独立单位。
进程是受操作系统管理的基本运行单元。
1.1.2 程序:程序是指令序列,这些指令可以让cpu完成指定任务。
1.1.3 线程:进程中独立运行的子任务 且线程的执行顺序具有随机性。
1.1.4 多线程的特点:同一时间可以执行多个任务,使用多线程也就是在使用异步。
1.1.5 什么场景下使用多线程?

  1. 阻塞 2) 依赖:业务分为两个执行过程A和B 当A业务发生阻塞情况时,B业务的执行不依赖A业务的执行结果,这时可以使用多线程来提高效率。
    2.1 如何使用多线程?
    1)继承Thread类:由于Java语言的特点是单根继承,所以为了支持多继承,实现Runnable接口即一边实现一边继承
    2)实现Runnable接口
    优点:由于Java不支持多继承的写法,实现这个接口相当于实现了“多继承”效果。
 //extends Thread创建子线程  继承Thread类
 class MyThread extends Thread{
    @Override
    public void run() {
        //线程执行体
        while(true){ //1
            System.out.println("eat food");//2
        }
    }
}
        //创建子线程对象
       Thread thread = new MyThread(); 
//实现runnab接口
class MyRunnable implements Runnable{

    @Override
    public void run() {
        //线程执行体
        while(true){ //1
            System.out.println("eat food");//2
        }
    }
}

3)匿名线程 匿名内部类
4) 实现Callable接口,重写call方法

class MyCallable implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for(int i=0; i<10000; i++){
            sum += i;
        }
        return sum;
    }
}

但是在使用多线程技术时,代码的运行结果与代码的执行顺序或者调用顺序是无关的。
2. 实例变量共享造成的非线程安全问题和解决方案
不共享数据的情况和共享数据情况造成的非同步问题
解决方案:synchronized关键字
如何解决:当一个线程想要执行同步方法里面的代码块时,线程首先尝试去申请这把锁,如果能申请到,那么不会执行关键字里面的代码,如果不能申请到这把锁,那么线程会不断尝试去申请这把锁,直到申请到为止,而且多个线程同时会去争抢这把锁。
2.3 Servlet技术造成的非线程安全问题和解决方案
啥是Servlet:小服务程序或者服务连接器
啥是非线程安全:主要指多个线程同一时间对同一个对象中的同一个实例变量进行操作时会出现值被更改,值不同步的情况,进而影响程序的执行流程。
2.4 println和i–操作可能会出现非线程安全问题
println()方法在方法内部是同步的,但是i–操作是在进入其方法之前发生的,所以发生非线程安全问题仍有一定的概率。
3 操作线程的一些方法和注意点
1)currentThread()方法:返回代码段正在被那个线程调用
2)run()方法和start()方法:前一个立即执行不启动新的线程 后面一个时机不确定启动新的线程
3)isAlive()方法:判断当前线程是否存活
什么是活动状态:线程已经启动尚未终止
4) sleep()方法:在指定时间内让当前正在执行的线程休眠
5)getId()方法:用于取得线程的唯一标识
6)停止线程:
a 使用退出标志使线程正常退出
b 使用stop()方法强行停止(不推荐使用,暴力停止造成数据缺失)
c 使用interrupt方法中断线程(使用这个方法仅仅只是在当前线程中做了一个停止大的标记,并不是真正的停止线程,且这个方法还有清楚状态的功能)
c.1 this.interrupted()方法:测试当前线程是否已经是中断状态,执行后具有清除状态标志值为false的功能
c.2 this.isInterrupted()方法:测试线程Thread对象是否已经处于中断状态,不清楚状态标志
注意:只要interrupt()和sleep()方法碰到一起就会出现异常
7)暂停线程:
suspend()方法暂停线程(过期方法) :暂停线程不销毁线程
resume()方法恢复线程
两个方法的缺点:独占 数据不完整
8)yield()方法:放弃当前的cpu资源,让其他任务去占用cpu执行时间,且放弃大的时间不确定
4 线程优先级
设置线程优先级使用setPriority()方法
线程优先级具有继承性,A线程启动B线程,则B线程的优先级与A线程是一样的。对于优先级高的线程往往先执行完,但结果不是绝对的,线程的优先级具有随机性。
5守护线程
java中有两种线程**:用户线程和守护线程**
**什么是守护线程:**守护线程是一种特殊的线程,当进程中不存在非守护线程,则守护线程自动销毁(类似于保姆的作用)典型的守护线程就是垃圾回收线程。
作用:为其他线程的运行提供便利的服务,典型的应用:GC 垃圾回收器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值