java中的多线程(二)
继java中多线程(一)
为什么要这么做?
答:继承Thread类,因为Thread类描述线程事物,具备线程应该有的功能。
为什么不直接创建Thread类的对象呢?
答:直接创建Thread对象没有错,但是该start调用时Thread类中的run方法,而这个run方法没有做什么事情,更重要的是这个run方法中并没有定义我们需要让该线程执行的代码。
创建线程的目的是什么?
答:是为了建立单独的执行路径,让多部分代码实现同时执行,也就是线程创建并执行需要给定的代码(线程的任务)
多线程的内存图&线程名称的获取,如下图
多线程执行时,在栈内存中,其实每一个执行线程都有一片属于自己的栈内存空间,当执行线程的任务结束了,线程自动在栈内存中释放了,当所有的执行线程都结束了,进程就结束了。
获取线程名称
Thread:currentThread()获取当前线程对象,怎么获取名称呢?getName();
多线程异常信息:如果多线程并发运行,如果一个线程出错,不会影响其他线程的运行。
创建线程的第二种方式:实现Runnable接口
1.定义类实现Runnable接口,避免了继承Thread类的单继承的局限性
2.覆盖接口中的run方法,将线程任务代码定义到run方法中
3.创建Thread类的对象
4.将Runnable接口的子类对象作为参数传递给Thread类的构造函数
5.调用Thread类中的start方法启动线程
线程的执行状态
多线程的安全问题:出现了错误的数据
如下图:
首先我们分析多线程安全问题出现的原因
1.线程任务中在操作共享的数据
2.线程任务操作共享数据的代码有多条(运算有多个)
解决思路:只要让一个线程在执行线程任务时将多条操作共享数据的代码执行完,在执行过程中,不要让其他线程参与运算。
如上图只需要将if判断和System输出封装起来,成为代码块,同步代码块synchronized(对象){//需要封装的操作}
同步好处:解决多线程安全问题
同步弊端:降低程序的性能
同步前提:必须保证多个线程在同步中使用的是同一个锁。