多线程部分笔记
作者:互联网
基本概念
多任务:
同时干多件事情,例如:吃饭玩儿手机,上厕所玩儿手机
多线程:
原来是单车道,但是车越来越多了 所以拓宽了到了 变成了多车道 ,不会出现拥堵的情况
进程
在操作系统中运行的程序就是进程 ,音乐 视频等.是系统资源分配的单位
线程
看电视时同时进行的声音,字幕,图像等就是线程,CPU调度和执行的单位
核心概念
线程创建
三种实现方式
-
Thread class 继承Thread类(重点)
-
Runnable接口 实现Runnable接口(重点)
-
Callable接口 实现Callbale接口(了解)
Thread
-
自定义想线程类继承Thread类
-
重写Run()方法,编写线程执行体
-
创建对象,调用.start()方法启动线程,调用.start()方法是同时执行,都是随机的CPU说了算, .run()是先跑自定义线程类内的
注意:线程开启不一定立即执行,由CPU调度
Runnable接口
实现Runnable接口,重写run方法,执行线程需要丢入Runnable接口实现类,调用.start()方法
与Thread对比:
Callable接口
-
实现Callable接口
-
重写call方法
-
创建执行服务 -->提交执行 - ->获取结果 - - >关闭服务ser.shutdownNow()
好处:可以定义返回值,可以抛出异常
龟兔赛跑案例
public class Race implements Runnable{
//胜利者
private static String winner;
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
//模拟兔子睡觉
if (Thread.currentThread().getName().equals("兔子")&&i%10==0){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//判断比赛是否结束
boolean falg = gameover(i);
//如果比赛结束了,就终止程序
if(falg==true){
break;
}
System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"米");
}
}
//判断是否完成比赛
private boolean gameover(int steps){
//判断是否有胜利者
if(winner!=null){//已经存在胜利者了
return true;
}{
if(steps>=100){
winner = Thread.currentThread().getName();
System.out.println("winner is "+ winner);
return true;
}
}
return false;
}
public static void main(String[] args) {
Race race = new Race();
new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
}
}
静态代理
-
真实对象跟代理对象都要实现同一个接口
-
代理对象代理真实角色
好处:
-
代理对象可以做很多真实对象做不了的事儿
-
真实对象专注做自己的事儿
λ表达式
概念:
-
避免匿名内部类定义过多
-
其实质属于函数式编程
为什么要用λ表达式
-
避免匿名内部类定义过多
-
让代码看起来更简洁
-
去掉一堆没意义的代码,只留下核心逻辑
函数式接口
任何接口,如果只包含唯一一个抽象方法,那他就是一个函数式接口
标签:Runnable,Thread,winner,笔记,start,线程,接口,多线程,部分 来源: https://www.cnblogs.com/wxsstudy/p/14793427.html