5. Thread和Runnable的区别和联系
1、Thread是一个类,Runnable是一个接口
2、Thread类实现了Runnable接口,重写了run方法
3、Runnable是一个接口,定义一个类实现接口的同时还可以继承其他类;
4、Runnable适合多个相同的程序代码的线程去处理同一个资源,代码可以被多个线程共享
6. 线程生命周期(必须要会描述)
新线程:当我们使用new关键字创建线程对象实例,那这个适合它只是作为一个对象存在,JVM没有为他分配CPU资源,
就绪状态:处于创建中的线程调用start方法将线程的状态转化为就绪状态,当前状态已经得到了其他的系统资源,在等待CPU资源
运行状态:就绪状态得到CPU资源后进入运行状态,执行run【call】方法中的代码段
等待/阻塞:线程运行的过程中被剥夺资源或则和我们在等待某些事件,这个就进入等待/阻塞状态,如supend()、sleep()被调用,或者线程使用wait()方法来等待条件变量,这个适合线程会释放所有的资源,但是并不释放锁,所以很容易引起死锁知道程序调用resume()方法回复线程运行。等待事件结束后或者得足够的资源就进入就绪态
死亡状态:当线程运行结束【正常结束】由JVM收回线程所占的资源
6 线程数据共享
练习:
要有5个售票点,用同一份数据,数据保持一致100张
使用Thread和Runnable两种方式完成
Synchronized
以上代码表示,当我们某个线程在使用这个方法的时候,其他线程无法使用当前方法,相当于给这个方法上了一个锁
join方法
Join用法
如上使用join()不传参时我们会先执行调用join的线程,只有在join的线程执行完了之后才会执行其他线程
如果join方法后面有传参,那么表示我们其他线程需要等待当前线程XX毫米,在等待完这个时长之后,其他线程就会开始执行
如上所示,join如果在start的前面将会失效,此时线程还未启动,此时使用join就不会有任何效果
t1调用了join方法,如果t1在规定的等待时间之前就完成了线程的运行,那么我们的其他线程就可以不用继续等待,可以直接进行线程的运行
7.线程同步和通信
创建一个用户类需要有名字,性别,还有showPerson方法(展示用户信息)、setPerson方法(将存入的用户信息替换)
创建一个线程类,修改用户信息。死循环一直去修改用户信息,如果是奇数就存一个对象,如果是偶数就存另一个对象
创建第二个线程类。一直去循环输出用户的信息,。
创建一个测试类。执行我们的两个线程
package com.etc.person; //用户类 public class Person { private String name; private String sex; public Person() { super(); } public Person(String name, String sex) { super(); this.name = name; this.sex = sex; } /** * 获取对象信息 */ public void showPerson() { System.out.println(this.name+","+this.sex); } public void setPerson(String name,String sex) { this.name = name; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
package com.etc.person; import java.util.Random; public class ModifyPerson implements Runnable{ private Person person; private int n; public ModifyPerson(Person person) { super(); this.person = person; } @Override public void run() { while(true) { //随机数去实例不同的用户去赋值 n=new Random().nextInt(100); if(n%2==0) { person.setPerson("A", "男"); }else { person.setPerson("B", "女"); } } } }
package com.etc.person; public class ShowPerson implements Runnable{ private Person person; public ShowPerson(Person person) { super(); this.person = person; } @Override public void run() { while(true) { person.showPerson(); } } }
package com.etc.person; public class Test { public static void main(String[] args) { //创建Person对象 Person person=new Person(); //修改线程对象 ModifyPerson md=new ModifyPerson(person); //显示用户信息线程对象 ShowPerson sp=new ShowPerson(person); Thread th1=new Thread(md); th1.start(); new Thread(sp).start(); } }
老铁,如果确实对你有帮助请点个免费的赞鼓励一下
白嫖不好,创作不易。各位的点赞就是我创作的最大动力,如果我有哪里写的不对,欢迎评论区留言进行指正,我们下篇文章见!