进程和多线程的概念
进程是收操作系统管理的基本运行单元
线程是在进程中独立运行的子任务
多线程可以在同一时间内运行更多不同种类的任务
注意:多线程是异步的,线程被调用的时候是随机的
使用多线程
继承Thread类
一种是继承Thread类,另一种是实现Runnable接口。
使用继承Thread类的方式创建新线程时,最大的局限就是不支持多继承,因为Java语言的特点就是单根继承,所以为了支持多继承,完全可以实现Runnable接口的方式,一边实现一边继承,这两个方式创建的线程在工作时的性质是一样的,没有本质区别。
线程是一个子任务,CPU以不确定的方式,或者说是以随机的时间来调用线程中的方法
实现runnable接口
有两个构造函数Thread(Runnable target)和Thread(Runnable target,String name)可以传递Runnable,说明构造函数支持传入一个Runnable接口的对象
实例变量与线程安全
共享数据的情况就是多线程可以访问同一个变量,通过加入synchronized关键字,达到了按照顺序对共享数据进行访问的效果,synchronized可以在任意对象及方法上加锁。
当一个线程想要执行同步方法的代码时,首先尝试拿锁,如果可以拿到,执行synchronized里面的代码,如果不能,不断尝试拿这把锁,直到能够拿到为止。
留意i--与System.out.println
虽然println()方法在内部是同步的,但是i--的操作却是在进入println()之前发生的,所以有发生非线程安全问题的概率
currentThread()方法
可以返回代码段正在被哪个线程调用的信息
isAlive()方法
测试线程是否处于活动状态
Thread.currentThread() 和 this 的差异
sleep()方法
指定毫秒数内让当前“正在执行的线程”休眠(暂停执行),这个“正在执行的线程”是指this.currentThread()返回的线程。
getId()方法
取得线程的唯一标识