进程:正在进行中的程序。 就是一个应用程序在内存中开辟的空间。
线程:负责进程中程序运行的一个控制单元。
一个进程中至少有一个线程。
多线程:可以同时执行多部分代码。就是一个进程中有多个线程。
特点:
1,让进程中产生多个执行路径。
2,随机性。
由CPU处理造成的,CPU在快速做着快速的切换造成的。
3,安全性。
Jvm启动:有两个线程,一个线程为了控制main函数的执行,另一个是控制垃圾回收机制的运行。
主线程:主函数中运行的代码。
创建线程的目的:开辟一个单独的路径,在执行一些代码的同时去执行指定的代码。
主线程运行代码位置: main函数中。
线程运行代码存放的位置:继承Thread类或实现Runable接口的子类中覆盖的run方法中。
线程创建的第一种方式:
1,声明一个Thread的子类。
2,覆盖Thread父类中的run()方法,并将线程要执行的内容写在run()方法中。
3,创建子类线程对象
4,启动子类线程对象的start() 方法。(告诉jvm启动线程,并执行子类中的run方法)
getName() :得到线程的名字。 (Thread-…)
主线程的名字如何得到:Thread.currentThread().getName();// 得到当前线程的名字。
构造函数传递线程名:
子类 (String name)
{
super(name);
}
IllegalThreadStateException :无效的线程异常。运行时异常。
InterruptedException:中断异常。
static 让数据共享。
线程第二种创建方式:(线程多用次方法)*****
1,实现Runable 接口,并覆盖run方法,将线程执行内容写进run方法中。
2,创建子类对象。
3,用Thread线程类创建线程对象,并将实现接口的子类对象作为实际参数传递给Thread类的构造方法。
(原因:因为线程执行的任务都封装在了Runable接口的子类中,必须将run方法所属的对象告诉线程,让线程明确要执行的任务)
4,调用Thread类的start方法开启线程,运行指定线程任务的run()方法。
避免了单继承的局限性。
创建线程,用继承Thread类方法的局限性:当次类有父类时不能继承Thread类。
Run方法是扩展功能,子类应该实现接口。
Runable的作用:定义线程执行的任务,将任务封装成对象。
好处:
1,避免了单继承的局限性。
2,降低耦合性:将低线程和执行任务的耦合性。
同步:(火车卫生间的原理)
格式:synchronized(对象)// 对象可以是任意的
{
}
好处:解决多线程的安全问题。
弊端:因为线程不断的判断锁,降低了效率。
安全问题:
多个线程操作同一个数据。
一个线程正在操作一段语句时,其他线程也参与了进啦。
同步的前提:
1,多线程。同一段代码是不是由两个以上线程操作。
2,必须是同一个锁。
(当线程出现安全问题时,加上同步问题依然存在,必须要考虑这两个前提)