Day12:JAVA 多线程上
注
真正的多线程是指多核,单CPU的多路进行只是错觉
线程三种创建方式:
-
继承Thread类
-
-
实现Callable接口
Idea快捷键20.for会快捷出现for(int i=0;i<20;i++){}循环体
Idea快捷键Ctrl+D复制光标所在行
线程开启后是由cpu调度执行的
要用外部包,就把其jar包导进来项目的lib目录下
多线程实际上是静态代理模式
线程优先级只是给JVM做一个参考而已,优先级高提高概率而已
Thread类
-
继承Thread类
-
重写run()方法
-
用对象调用start()方法开启线程
Thread currentThread();
String getName(); //获取线程的名字
sleep(); //线程睡一会再执行
Thread(Runnable r,String name);
Runnable接口
-
定义A类实现Runnable接口
-
重写run()方法
-
new Thread(new A()).start()
推荐用这种方法来开启线程
好处:避免单继承局限性,方便同一个对象被多个线程使用
Callable接口
好处:有返回值、可以抛出异常
-
实现Callable<T>接口
-
重写T call方法
-
创建线程类A
-
ExecutorService es =Executors.newFixedThreadPool(1);
-
Future<T> f = es.sumbit(new A());
-
T rs = f.get();
-
es.shutdownNow();
静态代理模式
interface Proxy{
void p();
}
class A implements Proxy{
@override
public void p(){}
}
class B implements Proxy{
private Proxy target;
public B(Proxy p){
target = p;
}
@override
public void p(){
before();
target.p();
after();
}
public void before(){}
public void after(){}
}
Lambda表达式
-
避免内部类定义过多
-
其实质属于函数式编程的概念
(params)->表达式|语句|{语句块}
参数列表,空参则用()
只有单个参数,只写这个参数就行,如a->run()
多个参数,也可以都去掉参数类型,但不能去掉括号,如:(a,b,c)->run(a,b,c)
函数式接口
任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口
对于函数式接口,可以通过lambda表达式来创建该接口的对象
线程
状态
创建状态 - 就绪状态 - 运行状态 - 死亡状态
/\ |
| \/
阻塞状态
方法
stop() //不建议用,建议自己设置标志位来停止线程
sleep(int mills) //进入阻塞状态
yield() //进入就绪状态
join() //插队直到死亡状态
Thread.State getState()
setPriority(int level) //设置线程优先级
getPriority()
状态属性Thread.State
NEW
RUNNABLE
BLOCKED
WAITTING
TIMED_WAITTING
TERMINATED

浙公网安备 33010602011771号