进程:是一个正在执行中的程序,
每个上进程执行都有一个执行顺序,顺序是一个执行路径,或者叫一个控制单元.
线程:就是进程中的一个独立的控制单元.
线程在控制着进程的执行.
一个进程中至少有一个线程.
java VM启动的地时候会有一个进程java.exe ,该进程中至少一个线程负责java程序的执行.而且这个线程运行的代码在于main方法中.该线程就是主线程main
jvm启动不止一个线程,还有负责GC的线程
多线程就一个目的,多段代码同时执行.相要多段代码同时执行时就用多线程
java多线程2—创建线程
/** * 创建线程的线种方式一,继承Thread,重写run方法 */ public class Test03 { public static void main(String[] args) { //这是创建一个线程,会有一个独立的线程内存空间 ThreadDemo demo = new ThreadDemo(); // 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 demo.start(); } } /** * 定义一个线程类,(就是继承Thread) * Override run方法.run方法中的代码就是这个线程要执行的代码.(线程体) */ class ThreadDemo extends Thread{ @Override public void run() { System.out.println("一个线程"); } }
java多线程3-线程的几种状态
1,被创建—start()—运行—sleep(time)—>冻结
-->wait() -->冻结
notify<--
2,阻塞状态.--等待执行权,有执行权
3,冻结-放弃了执行权,
4,消亡状态.
java多线程3-Thread类认识
获取线程对象及名称
线程的默认名称Thread-编号.编号从0开始.
1,getName()方法得到线程名.
2,setName()设置线程名称.
在构造方法方中给线程设置名字
class Test extends Thread{ //构造方法中,设置线程名字. Test(Stirng name){ //可以直接super()因为父类中已定义 super(name) } public void run(0{ //TODO } }
static curentThread():相当于线程中this.获取当前线程对象.静态的
线程状态异常
同一个线程多次.start(),一个线程已经是在运行了,在去调用start().就是IllegalThreadStateException()
java多线程4-创建线程2
第二种创建线程的方法,实现Runnabl接口.
/** * 创建线程的第二种方法 */ public class Test03 { public static void main(String[] args) { //这里并没有创建线程,只是定义的一个Runnable的子类. ThreadDemo demo = new ThreadDemo(); //这里才是创建了4个线程 Thread t1 = new Thread(demo); Thread t2 = new Thread(demo); Thread t3 = new Thread(demo); Thread t4 = new Thread(demo); //这样才可以同时开启多线程执行同一代码. t1.start(); t2.start(); t3.start(); t4.start(); } } /** * 实现Runnable接口,Runnable接口只有一个抽象的run方法. */ class ThreadDemo implements Runnable{ @Override public void run() { System.out.println("一个线程"); } }
Runnable接口的定义就是为了规范线程要执行的代码的存入的位置.(就是run方法)
注意:run方法中的异常只能try,
多线程中明确的几点:
1,明确哪些代码是多线程运行代码.
2,明确共享数据
3,明确多线程行动代码中哪些语句操作共享数据的.
java多线程5-锁
1,同步方法用的是this对象,静态方法同步用的是Class对象
2,死锁:同步中嵌套同步,两个同步的锁确不同.
3,线程访问共享数据的安全,所以要用锁.
java多线程6-线程等待与唤醒
1,线程运行的时候内存中会建立一个线程池,等待线程都在存在这个线程池中notify()唤醒的一般线程池中第一个等待的线程
wait(),notify(),notifyAll()都使用在同步中,因为要对持有的锁的线程操作.
只有同一个锁上的被等待线程,可以被同一个锁上的线程notify唤醒
也就是:等待和唤醒必须是同一个锁.
在多线程的时候要注意两点,
1,循环判断标记--所要用while
2,还要唤醒对方线程,也就是要通知的线程,用notifyAll()唤醒所有.为了避免所有线程都wait().不过用notifyall()也有一个缺点会唤醒本方线程.
java多线程7-JDK1.5之后
1,显示的锁机制.Lock里面的lock和nulock
2,Object中的wati,notify,notifyAll 替换了Condition对象.
3,该对象可以Lock进行获取,可以实现本方线程只唤醒方线程
java多线程7-线程的停止
1,停止线程只有一个种方法,那就是run方法结束.
2,开启多线程,通常都要用循环结构.(你不用循环的话,就在一个线程里面跑得了,反正你run方法就那几行代码,运行完了还不是单线程)
3,所以只要控制好循环就可以,控制好线程什么时候结束.
interrupt()—这个方法,是中断线程.就是清除线程的冻结状态.让线程运行下去,把run方法运执行完.然后结束线程.
会抛出InterruptException
其它方法:
jion方法--等待该线程结束.在A线程是指使B线程去调用jion方法,那么A线程就会等到B线程结束后在去运行.
setDaemon(true)--那个线程调用这个方法,那么这个线程就会变成后台线程(守护线程).但是不知道它守护那个线程.
yield()--暂停当前正在执行的线程对象,并执行其它线程.