实现Callable接口
-
要实现callable接口的话,需要返回值类型
-
重写call方法,在这个时候呢还要抛出异常
-
创建目标对象
-
创建执行的服务 ExcutorServer ser=Executors.newFixedThreadPool(1)
-
提交执行 Furtureresult1=ser.submit(t1);
-
获取结果 Boolean r1=result .get();
-
关闭服务:ser.shutdownNow();
代理模式
创建一个接口
interface Marry{
void HappyMarry();
}
创建一个实现类
class You implements Marry{
@Override
public void HappyMarry() {
System.out.println("MarryHappy");
}
}
静态代理
-
真实对象和代理对象都要实现同一个接口
-
代理对象要代理真实角色
-
代理对象可以处理真实对象处理不了的事
-
真实对象专注于自己的事情
创建代理类
class WeddingCompany implements Marry{
private Marry target;
public WeddingCompany(Marry target) {
this.target= target;
}
@Override
public void HappyMarry() {
before();
this.target.HappyMarry();
after();
}
private void before(){
System.out.println("前");
}
private void after(){
System.out.println("后");
}
}
调用
public class test2{
public static void main(String[] args) {
WeddingCompany weddingCompany=new WeddingCompany(new You()); weddingCompany.HappyMarry(); }}
Lambda表达式
作用
-
可以避免就是内部定义的类过多
-
可以让代码看起来整简洁把。(刚学的时候可能会觉得更乱)
-
留下核心代码
函数式接口
-
接口中,只包含一个抽象方法就是函数式接口:
public interface Runnable{ public abstract void run();}
以上就只有一个抽象方法 run()一定要有
-
/** * 1定义接口 */ interface Ilike{ void lamda();}
-
//lambda简化 like=()->{ System.out.println("yes"); }; like.lamda(); }
线程状态
- Thread t=new Thread()线程对象一旦创建就进入到了新生状态**(new)**
- 调用start()方法,线程;立即进入就绪状态,但不意味着立即调度执行
- 进入运行状态,线程才真正执行线程体的代码块
- 堵塞状态,当调用sleep,wait或同步锁定时,线程进入堵塞状态,代码不往下执行,堵塞时间解除后,重新进入就绪状态,等待cpu调度执行。
- dead,死亡状态,线程中断或者结束,一旦进入死亡状态,就不能再再次启动。。
可以输出线程状态
Thread.start();
state=thread.getState();
system.out.println(state);
线程方法
setPriority (int newPriority)
//更改线程的优先级
static void sleep(long millis)
//指定毫秒数内让当前执行的线程休眠
void join()
//等待该线程终止
static void yield()
//暂停当前正在执行得线程对象,并执行其他线程
void interrupt()
//中断线程(一般还是不要用)
boolean isAlive()
//判断线程是否处于活动状态
停止线程的话要让程序自己停止下来才好,可以使用一个标志进行终止变量,当flag=false,则终止线程运行
格式
public class TestStop implements Runnable{
//1.线程中定义线程体使用得标识
private Boolean flag=true;
@override
public void run(){
//2.线程体使用该标识
}
//3.对外提供方法改变标识
public void stop(){
this.flag=false;
}
}
线程休眠sleep
进入休眠的状态,让其他的线程来执行。
- 模拟倒计时
public class Sleep{
public static void main(String[] args) {
tenDown();
}
public void tenDown() throws InterruptedException{
int num=10;
while(true){
thread.sleep(1000);
system.out.printfln(num--);
if(num<=0) break;
}
}
}
每一秒钟跑一次
- sleep和wait的区别、
每一个对象都有一个锁,sleep不会释放锁
sleep | wait | |
---|---|---|
同步 | 只能在上下文中调用该wait,要抛出异常 | 不需要同步啦 |
作用对象 | Object类 | Thread中,作用与当前线程 |
释放锁对资源 | 是 | 否 |
唤醒条件 | 其他线程调用对象notify()或者notifiyAll() | 超时或者调用interrupt方法体 |
方法属性 | 实例方法 | 静态方法 |
线程礼让yield
有A和B,A礼让B,自己的线程停止运行,然后再由cou重新调度,可能礼让不会成功都得看cpu的心情
Thread.yield();//礼让
线程强制执行join
合并线程,待此线程执行完成之后,在执行其他线程,其他线程堵塞,,,,,,可以想象成食堂吃饭插队
Thread.join();//很霸道的方法
线程优先级
-
用数字表示
Thread.MIN_PRIORITY=1;
Thread.MAX_PRIORITY=10;
Thread.NORM_PRIORITY=5;
-
改变获取优先级
gerPriority().setPriority(int xxx)
最后感觉自己学习并不扎实,学了又忘还没有完全学会用自己的方法去理解。。还是要坚持下去,好好学好好扎实的学,放进代码巩固实践,最近经常和我说”学习如逆水行舟,不进则退“。希望我自己能体会懂得。也很感谢实验室的伙伴对我们的监督!!!