线程、多线程同步、线程之间的通信
多线程,可以这样理解:
读一本书为一个线程,听一首歌为一个线程。当我们同时做这两件事的时候,要么听了歌曲,读完了书却不记得读了什么,或者读了书,却没有记住歌曲听的是什么。
CPU可以比作是大脑,读书和听音乐都是线程,每次CPU都只能执行一个线程,执行完一个线程才会执行下一个线程
Java中主要提供了两种方式实现线程:分别为继承java.lang.Therad类 和实现 java.lang.Runnable接口
Therad类:
为了方便查看 我将两个个类中的东西都写到了一起,中间用*******隔开的
package com.maya.Test; public class MaYi extends Thread { private String name; //成员变量 public MaYi(String name){ //构造函数 this.name=name; } public void run(){ //run方法 线程执行的内容要写在这里面 while(true){ try { Thread.sleep(2000); //延迟2000毫秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.name+"蚂蚁正在下载"); } } } ******************************************************************************************************** package com.maya.Test; public class Test { public static void main(String [] args){ MaYi my1=new MaYi("蚂蚁一号"); //造新的线程 my1.start(); MaYi my2=new MaYi("蚂蚁二号"); my2.start(); MaYi my3=new MaYi("蚂蚁三号"); my3.start(); MaYi my4=new MaYi("蚂蚁四号"); my4.start(); } }
输出的结果如下
由此可以看出,多个线程同时执行时,并没有按照固定的顺序来执行,而是抢占CPU来执行自身,哪个抢到,哪个先执行
Runnable 接口
package com.maya.Test; public class TuZi implements Runnable { private String name; public TuZi(String name){ this.name=name; } @Override public void run() { while(true){ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.name+"兔子在跑"); } } } ************************************************************************************************** package com.maya.Test; public class Test { public static void main(String [] args){ TuZi t=new TuZi("1号"); Thread d=new Thread(t); d.start(); TuZi t2=new TuZi("2号"); Thread d2=new Thread(t2); d2.start(); TuZi t3=new TuZi("3号"); Thread d3=new Thread(t3); d3.start(); } }
在控制台中的结果同上;
多线程同步块:synchronized(参数){}
假设兔子3只兔子一共跑了100米,想要三个线程同步,即一只兔子跑了x米,其他兔子继续跑剩下的米数;
package com.maya.Test; public class TuZiPao extends Thread { private static int changdu=100; private String name; private Object obj; public TuZiPao(String name, Object obj){ this.name=name; this.obj =obj; } public void run(){ while(true){ synchronized (obj) { //这里的obj相当于是一把钥匙 try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } changdu--; if(changdu<=0){ System.out.println("已经跑完了全程"); break; } System.out.println(name+"兔子跑了一米,还剩下"+changdu ); } } } } ************************************************************************************************** package com.maya.Test; public class Test { private Object obj; public static void main(String [] args){ Object obj=new Object(); TuZiPao t=new TuZiPao("1号", obj); Thread d=new Thread(t); d.start(); TuZiPao t2=new TuZiPao("2号",obj); Thread d2=new Thread(t2); d2.start(); TuZiPao t3=new TuZiPao("3号",obj); Thread d3=new Thread(t3); d3.start(); } }
线程的7种状态: 新生,就绪,执行,等待,休眠,死亡,阻塞
新生:new出来的时候
Therad s=new Therad();
就绪:start()
a.start()
执行:run()函数中的内容
public void run() { while(true){ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.name+"兔子在跑"); } }
等待:notify()或者notifyall()
a.notify()
休眠 : therad.sclle(2000)
死亡 :线程结束
阻塞
我们不是制造者,我们是代码搬运工