java多线程补充
java多线程
1.初见
java的线程是通过java.lang.Thread
类来实现的。每个线程都是通过某个特定Thread对象所对应的方法run()
来完成其操作的,方法run()称为线程体。通过调用Thread类的start()
方法来启动一个线程。
狂神的两个小demo
demo01
第一个建立线程的方法
package com.kuang;
public class demo01 extends Thread{
demo02
用Runable接口来实现
package com.kuang;
public class demo02 implements Runnable{
通过分析源码可以看出来
Thread继承了Runable的接口
Runable接口实现了run()方法
但是你的Thread才是线程,不能直接用Runable直接测试run方法,还得通过Thread来进行测试
demo03
发现并发问题
一共5张票,但是三个人抢的话,都会遍历一个遍
package com.kuang;
public class demo03 implements Runnable{
/**
* 通过买票发现并发问题
*/
结果:
小红抢到了第1票
黄牛抢到了第1票
小米抢到了第1票
黄牛抢到了第2票
小红抢到了第2票
黄牛抢到了第3票
小米抢到了第2票
黄牛抢到了第4票
黄牛抢到了第5票
小红抢到了第3票
小米抢到了第3票
小红抢到了第4票
小米抢到了第4票
小红抢到了第5票
小米抢到了第5票
显然不符合要求
demo04
利用多线程解决龟兔赛跑
package com.kuang;
public class demo04 implements Runnable{
结果:
🐢跑了999米 🐢跑了1000米 🐇跑了996米 🐇跑了997米 🐇跑了998米 🐇跑了999米 🐇跑了1000米 🐢获胜
2.Lamda表达式
演变过程!!
package com.kuang.lambda;
public class evolution {
//2.2静态内部类
static class Like2 implements llike {
第二个例子最简化:
package com.kuang.lambda;
public class test {
public static void main(String[] args) {
ILove iLove = a-> System.out.println("i love" + a);
iLove.love(2);
}
}
interface ILove
{
void love(int a);
}
3.静态代理
代理模式是常用的Java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
package com.kuang.static01;
public class marry {
public static void main(String[] args) {
//对比多线程,也是Runnable target静态代理
new Thread(() -> System.out.println("asdasd")).start();
weddingCompany weddingCompany = new weddingCompany(new you());
weddingCompany.Marry();
}
}
interface marryy{
void Marry();
}
class you implements marryy{
4.线程方法
线程停止:
package com.kuang.test;
public class stop implements Runnable{
private boolean st = true;
线程休眠:
package com.kuang.test;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;
public class testSleep {
//倒计时
public static void tendown() throws InterruptedException {
int num = 10;
while (true)
{
Thread.sleep(1000);
System.out.println(num);
num --;
if(num <= 0)break;
}
}
public static void main(String[] args) throws InterruptedException {
//tendown();
Date date = new Date(System.currentTimeMillis());
while(true)
{
int num = 10;
num --;
Thread.sleep(1000);
if(num <= 0)break;
System.out.println(new SimpleDateFormat("HH:mm:ss").format(date));
date = new Date(System.currentTimeMillis());
}
}
}
线程礼让:
package com.kuang.test;
public class yield {
public static void main(String[] args) {
myYield myYield = new myYield();
new Thread(myYield,"a").start();
new Thread(myYield,"b").start();
}
}
class myYield implements Runnable{
礼让可能成功,可能不成功
结果1:
b开始执行 a开始执行 b结束执行 a结束执行
结果2:
a开始执行 b开始执行 b结束执行 a结束执行
线程插队:
package com.kuang.test;
public class testJoin implements Runnable{
值得一提的是,小于100的时候这两个是并发处理的,但是的等于100后就会先执行线程里面方法,主线程就是在等待中
5.线程状态观察
1.创建状态
2.启动状态
3.运行状态
4.阻塞状态
5.死亡状态