1.1 进程和线程的概念
进程是受操作系统管理的基本运行单元,而线程可理解为在进程中独立运行的子任务。使用多线程技术,可在同一时间内运行不同的任务,使系统的运行效率提高。
一个运行着的程序至少有一个线程在运行,调用public static void main(String[] args)方法的线程是有JVM创建的。
1.2 使用多线程
1.2.1 继承Thread类
1)使用多线程时,代码的运行结果与代码的执行顺序是无关的:
2)执行start()方法的顺序不代表线程启动的顺序:
1.2.2 实现Runnable接口
由于java不支持多继承,当需创建的线程类已经有父类时,就不能继承Thread类了,此时需要通过实现Runnable接口。
需要注意的是Thread.java类也实现了Runnable接口,这意味着可以把一个Thread类对象传入构造函数Thread(Runnable target),也就是说可以把一个Thread类对象的run()方法教给其它线程调用。
1.3 实例变量与线程安全
1)不共享数据的情况:
2)共享数据时的情况:(多个线程访问同一个变量)
2.1)i--操作引起的线程不安全:
“非线程安全”是指多个线程对同一个对象的同一实例变量进行操作时,出现值被更改、值不同步的情况。
本例中产生非线程安全的原因是,在JVM中,i--不是原子性操作,分为三步:取得i的值 --> 计算i-1 --> 对i进行赋
值。可以在run()方法前添加synchronized关键字来实现线程安全。
2.2)另一个线程不安全的例子: