JAVA学习----多线程 |
一.创建线程方式 |
1.方式一 |
StartThread st=new StartThread();
(2)启动:创建子类对象+启动
st.start();//开启线程,交给CPU去调用,不保证立即运行
2.方式二 |
(2)启动:创建实现类对象++Thread对象启动
推荐这种接口方式:
(1)避免单继承的局限性,优先使用接口
(2)方便共享资源
①创建实现类对象
StartRun sr=new StartRun();
②创建代理类对象
Thread t=new Thread(sr);
③启动
t.start();
*进一步简化(用lambda): |
class Like implements ILike{
@Override
public void lambda() {
System.out.println("I Like You!1");
}
}
②静态内部类(放到主类):
static class Like2 implements ILike{
③方法内部类(放到main函数内):
class Like3 implements ILike{
④方法匿名内部类:
like4=new ILike() {
⑤lambda简化:
like=() ->{
System.out.println("I Like You!5");
};
最后都要加:
like.lambda();
二.线程状态 |
isAlive():线程是否还活着 ;
Thread.currentThread():当前线程 ;
设置名称:真实角色+代理角色:setName,getName:代理名称 ,真实名称由面向对象来设置 ;
sleep模拟网络延时;
yield礼让线程,暂停线程,直接进入就绪状态,不是阻塞状态;
Join:合并线程插队线程
Daemon守护线程:为用户线程服务,JVM不用等待守护线程执行完毕,默认用户线程,JVM等待用户线程执行,否则不会完毕;
优先级代表概率,不代表先后顺序;
终止线程:
- 1.线程正常执行完毕,次数
- 2.外部干涉,加入标识
- 不要用stop
三.线程协作 |
1.管程法 (加缓冲区) : 【程序前后顺序】
①生产者:继承Thread,结构体,重写run(生产具体事项:输出+生产)
②消费者:继承Thread,结构体,重写run(消费具体事项:输出)
③缓冲区:定义一个缓冲区,两个 synchronized程序(生产+消费)【等待+运行+通知】
④馒头
2.信号灯法(借助标志位):【编程先后顺序】
①制定大体框架:生产者,消费者,同一个资源
②生产者,消费者都继承Thread(都从生产者开始写,消费者复制即可)
③生产者,消费者都重写run(都从生产者开始写,消费者复制+改动即可)
④同一个资源:定义主要参数+标志位
⑤两个 synchronized程序(生产+消费)【等待(条件应该相反)+运行+唤醒+切换标志】