1.多线程:只要启动java虚拟机就会启动一个线程,叫做主线程。
概念:
程序(program):代码的集合,是静态的
进程(progress):程序的一次执行(运行着的程序),动态的
线程(Thread):线程中可以并行执行的小任务
创建线程的方式:
Thread类
Runnable接口
Callable接口(juc)
线程池(juc)
Thread类:代表一个线程,Thread中有一个run方法,这个方法是一个线程体,判断target是否为空,不为空则运行Runnable.run,否则什么都不执行。
常用方法:
run()执行线程体
start()启动线程
sleep()休眠的毫秒数,这是一个静态方法。
yield()让当前线程让步(进入就绪状态),并执行其他线程。
join()等待当前线程终止,才能进入主线程。
getId()获得线程的唯一标识。
getName()获得线程名
currentThread()获得当前代码所在线程的引用
创建线程的常用步骤
1.定义一个类(A),继承Thread(),重写run方法
2.创建线程对象,(A a=new A();)
3.启动线程a.start();线程的生命周期:
新生-》就绪-》执行-》阻塞-》消亡- Runnable接口
定义一个类实现Runnable接口,重写run方法
定义一个Thread(Runnable)把接口作为参数传递给它 - 当多个线程对同一资源(对象,变量)进行操作时,可能会引发线程安全问题。
资源竞争问题:当多个线程试图访问一个资源是,可能会出现资源竞争的问题,我们可以通过同步锁来解决此问题,即将访问资源的代码放在一个同步块或同步方法中;当需要执行此代码是,必须先得到锁才能执行;如果得不到锁则不能执行,只能将线程放在锁池中等待其他线程释放锁 - 使用同步块和同步方法可以解决线程并发是遇到的安全问题:同步块的语法:
synhronized(monitor){
}
monitor可以是任何对象,想要运行同步块中的代码,必须先获得monitor,同一时刻只能有一个monitor的线程获得monitor对象,块中的代码执行完毕后monitor会自动释放。
同步方法中使用的monitor是this。 - 如果某个synchronized方法是static的,那么当线程访问该方法是,他锁的并不是synhronized方法所在的对象而是synhronized所对应的Class对象,因为java中无论一个类有多少个对象,这些对象会对应一个唯一的Class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,他们的执行顺序也是顺序的(先去执行一个线程,完毕后另一个线程再执行)。
- 如果一个变量是成员变量,那么多个线程对用一个对象的成员变量进行操作时他们对成员变量是彼此影响的(一个线程对成员变量的改变会影响到另一个线程)。
9.线程8锁
1.两个普通同步方法,两个线程,标准打印