多线程
线程创建方式三:实现Callable接口
- 需要有返回值,要与重写的方法相同
- 重写call方法,需要抛出异常
- 创建目标对象
- 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool()
- 提交执行:Future result1 = result1.get()
- 获取结果:boolean r1 = result1.get()
- 关闭服务:ser.shutdownNow()
静态代理
- 线程的底部原理
- 案例:结婚
你:真是角色
婚庆公司:代理你,帮你处理加魂的事
结婚:需要实现的接口
public class Marry {
public static void main(String[] args) {
You you = new You();
Wedding w = new Wedding(you);
w.happyMarry();
}
}
interface IMarry{
void happyMarry();
}
class You implements IMarry{
@Override
public void happyMarry() {
System.out.println("我结婚了");
}
}
class Wedding implements IMarry{
private IMarry target;
public Wedding(IMarry target) {
this.target = target;
}
@Override
public void happyMarry() {
befor();
this.target.happyMarry();
after();
}
public void befor(){
System.out.println("布置现场");
}
public void after(){
System.out.println("收尾款");
}
}
Lamda表达式
- 函数式接口:只包含唯一一个抽象方法的接口就是函数式接口
- 我们可以通过lambda表达式来创建该接口的对象
public class TestLamda {
static class Like2 implements ILike{//2.静态内部实现类
@Override
public void lambda() {
System.out.println("Lambda2");
}
}
public static void main(String[] args) {
ILike l = new Like();
l.lambda();//调用的是外部实现类
l = new Like2();//对l进行再定义
l.lambda();//调用的是静态内部实现类
class Like3 implements ILike{//3.局部内部实现类
@Override
public void lambda() {
System.out.println("Lambda3");
}
}
l = new Like3();//再定义l
l.lambda();//调用的是局部内部实现类
//4.匿名内部类,没有类的名称,必须借助接口或者父类实现
l = new ILike() {//new接口后直接重写方法
@Override
public void lambda() {
System.out.println("Lambda4");
}
};
l.lambda();
//5.Lambda简化
l = ()->{//写接口对象后直接写方法体,用->连接
System.out.println("Lambda5");
};
l.lambda();
}
}
//定义一个函数式接口
interface ILike{
void lambda();
}
class Like implements ILike{//1.外部实现类
@Override
public void lambda() {
System.out.println("Lambda");
}
}
public class TestLambda2 {
public static void main(String[] args) {
ILove i = (String s)->{//()内为重写方法时的参数
System.out.println("Love"+s);
};
i.love("I love you");
/*
Lambda表达式简化:
1.参数类型可以不写,括号也可以去掉但在多个参数时,要么都写参数类型,要么都不写,多个参数必须加括号
2.在只有一行方法体时可以去掉花括号
*/
}
}
interface ILove{
void love(String s);
}
线程状态
![]()
线程停止
- 测试stop
1)建议线程正常停止,可以利用次数,不建议死循环
2)建议使用标志位,设置一个标志位
3)不要使用stop或者destroy等过时或JDK不建议书用的方法
public class TestStop implements Runnable{
//设置一个标志位
private boolean flog = true;
@Override
public void run() {
int i = 0;
while (flog){
System.out.println("run----Thread"+i++);
}
}
//设置一个公开的方法停止线程,转换标志位
public void myStop(){
this.flog = false;
}
public static void main(String[] args) {
TestStop testStop = new TestStop();//创建一个线程对象
new Thread(testStop).start();//开始线程
for (int i = 0; i < 1000; i++) {
System.out.println("main"+i);
if (i==900){
//调用start方法切换标志位,让线程停止
testStop.myStop();
System.out.println("线程停止了");
}
}
}
}