-------android培训、java培训、期待与您交流! ----------
1.进程定义:一个正在执行的程序,每一个程序的执行都有一个执行顺序,该顺序是一个执行路径也叫一个控制单元。
一个进程中至少有一个线程
线程定义 :就是进程中的一个独立的控制单元。线程控制着进程的执行
2.Java程序在执行过程中除了有一个main函数主线程外还有一个垃圾回收的线程。这个线程我们看不到,是由jvm创建并启动执行的。
3.创建线程的方式有两种:
1)通过extendsjava.lang.Thread类,覆盖父类run方法来实现
public class ThreadDemo extends Thread
{
public void run()
{}
}
启动线程的时候创建ThreadDemo的实例并且调用start()方法(启动线程并执行)。该方法会调用run方法来执行我们需要进行多线程处理的代码。如果是直接通过实例调用run方法,则线程不会启动。和普通对象调用方法没什么区别。要启动线程则必须调用start()方法。
2)通过实现Runable接口。覆盖接口中的run()方法。
public class ThreadDemo implements Runable
{
Public void run()
{}
}
在使用该类的时候,创建该实现类的实例。然后创建Thread的实例,并且将实现类的实例作为参数传给Thread类的构造函数。调用Thread的实例的start()方法来启动线程。线程执行过程中调用实现类的run方法。
第二种实现方式的好处在于:避免了java程序单一继承的局限性。当我们的一个类已经继承了其他的类以后就无法再继承Thread类了,此时就没办法通过第一种方式来实现了。采用第二种方式,可以继承其他的类并且实现Runable接口。这也是接口设计带来的好处。
两种方式实现的区别:
继承Thread:线程代码存放在Thread子类的run方法中
实现Runable接口:线程代码存放在实现了Runable接口的类的run方法中。
我们在写多线程程序的时候推荐使用第二种实现Runable接口的方式 。如果我们的类没有父类,则使用第一种方式也是可以的。
4.多线程的运行可能会出现安全问题:
原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分。还没有完全结束。另一个线程参与进来执行了。导致共享数据错误。
解决办法:多条操作共享数据的语句的线程在没有执行完的时候,
不能让其他线程参与进来。
Java使用同步代码块或者同步方法的方式来解决多线程出现的安全问题。
Synchronized(对象){//statement}
代码中的“对象”如同锁,只有持有锁的线程才能在同步中执行。没有持有锁的线程即使获取cpu的执行权也进不去,也就不能执行。因为没有获取锁。
重点内容:同步的前提
1. 必须要有两个或者两个以上的线程
2. 必须要是多个线程使用同一个锁。
必须保证同步中只能有一个线程在运行。其他线程处于等待状态。
使用同步代码块的方式虽然能解决多线程的安全问题但是多个线程需要不断的判断锁,较为消耗系统资源。
5.当多线程程序出现数据安全性问题到时候,我们如何快速找出问题所在?
1.明确哪些代码是多线程运行代码。
2.明确共享数据
3.明确多线程运行代码中哪些语句是操作共享数据的
6.当一个方法被static修饰同时也是synchronized的。他使用的锁就是当前类的字节码对象,也就是“当前类.class”表示的对象。该对象在内存中只有一份。