用多线程只有一个目的,那就是更好的利用cpu的资源
并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。
线程安全
同步
volatile
多线程的内存模型:main memory(主存)、working memory(线程栈),在处理数据时,线程会把值从主存load到本地栈,完成操作后再save回去(volatile关键词的作用:每次针对该变量的操作都激发一次load and save)。
针对多线程使用的变量如果不是volatile或者final修饰的,很有可能产生不可预知的结果(另一个线程修改了这个值,但是之后在某线程看到的是修改之前的值)。其实道理上讲同一实例的同一属性本身只有一个副本。但是多线程是会缓存值的,本质上,volatile就是不去缓存,直接取值。在线程安全的情况下加volatile会牺牲性能。
public Thread(Runnable target)
target
- the object whose
run
method is invoked when this thread is started.
public void start()
通过调用线程对象引用的start()方法,使得该线程进入到就绪状态,此时此线程并不一定会马上得以执行,这取决于CPU调度时机。
Thread thread = new MyThread(myRunnable);
线程执行体是MyThread类中的run()方法
因为Thread类本身也是实现了Runnable接口,而run()方法最先是在Runnable接口中定义的方法。
@Override
public void run() {
if (target != null) {
target.run();
}
}
当执行到Thread类中的run()方法时,会首先判断target是否存在,存在则执行target中的run()方法,也就是实现了Runnable接口并重写了run()方法的类中的run()方法。但是,由于多态的存在,根本就没有执行到Thread类中的run()方法,而是直接先执行了运行时类型即MyThread类中的run()方法。
可运行线程 一旦调用start() 线程处于runnable状态。 一个可运行的线程 可能正在运行也可能没有运行,这取决于操作系统给线程提供运行的时间。