Java多线程

Java多线程

JavaThread
在这里插入图片描述
多任务–>多线程
在这里插入图片描述
期望变成下图所示。
在这里插入图片描述
进程process与Thread
在这里插入图片描述
在这里插入图片描述
先后顺序是不能人为干预的。
同时,线程会带来额外的开销。
垃圾回收线程gc进程。

线程的创建

三种方式:
在这里插入图片描述
callable在工作3-5年之后在进行了解。

  1. 继承Thread,重写run方法。
    在这里插入图片描述
public class  TestThread extends Thread{
	public void run(){
	//run方法线程体
		for(int i=0;i<20;i++){
			System.out.println("我在看代码");
		}
	}
	public static void main(String[] args){
		//main线程,主线程
		TestThread tt = new TestThread();
		tt.start();

		for(int i=0;i<20;i++){
			System.out.println("我在学多线程");
		}
	}
}

注意线程开启不一定立即执行,由cpu调度执行,线程并行交替执行。
调用的是start,注意!!!
2. 在这里插入图片描述
在这里插入图片描述

实现Runnable接口

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
代理,需要创建一个线程对象,然后通过线程对象来开启线程。

在这里插入图片描述

两者的区别

在这里插入图片描述
由于java 是单继承,所以推荐使用Runnable接口。
Thread修改之后实现Runnable接口
在这里插入图片描述

小结

在这里插入图片描述

package caculator;

public class TestThread1 implements Runnable{

    private  int ticketnum = 10;
    @Override
    public void run() {
        while(true){
            if(ticketnum<0)
                break;
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"-->拿到了第"+ticketnum--+"张票");
        }
    }

    public static void main(String[] args) {
        TestThread1 ticket = new TestThread1();

        new Thread(ticket,"小明").start();
        new Thread(ticket,"小米").start();
        new Thread(ticket,"妞妞").start();
    }
}

龟兔赛跑
在这里插入图片描述
在这里插入图片描述
线程创建方式3实现callable接口。

  1. List item
    首先实现callable接口,需要有一个返回值,<>
  2. 重写call方法
    在这里插入图片描述
  3. new类时有所不同在这里插入图片描述
    固定大小的线程池。
    在这里插入图片描述
    new了1个池子,这个池子里有3线程。
    在这里插入图片描述
    callable
    可以定义返回值,可以抛出异常。
    在这里插入图片描述

静态代理

在这里插入图片描述

真实对象和代理对象都要实现同一个接口,代理对象要代理真实角色。
通过代理角色替真实角色完成一些事。
好处:真实对象可以专注做自己的事情,而代理对象可以做很多真实对象做不了的事情。
在这里插入图片描述

可以将以下两个对比来看
在这里插入图片描述
thread代理runnable,实现start方法。
静态代理就是线程底部的实现方法。

lamda表达式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
包含静态内部类的知识。
在这里插入图片描述
局部内部类
在这里插入图片描述
匿名内部类
在这里插入图片描述
没有类的名称,必须借助接口或者父类。但是前面还是需要加上ILike
最终采用lambda简化。
在这里插入图片描述
有参lambda实现
在这里插入图片描述
lambda表达式的简化,
在这里插入图片描述
去掉花括号的原因是因为代码只有一行,多行就不可以。
去掉括号的原因是前提是接口是函数式接口。
多个参数也可以去掉参数类型,要去掉就都去掉,必须加上括号,(a,b)。

线程状态

在这里插入图片描述
在这里插入图片描述

线程方法
在这里插入图片描述
在这里插入图片描述
@Deprecated,代表这个方法已经不建议使用了。
在这里插入图片描述
在这里插入图片描述
模拟网络延时,可以放大问题的发生性。
在这里插入图片描述
在这里插入图片描述
礼让不一定成功,要看cpu的心情。
Thread.currentThread.getName();
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
死亡之后的线程就不能再次启动了。
getstate();
在这里插入图片描述
线程优先级
在这里插入图片描述
相应的maxpriority和minpriority都对应相应的数字。
在这里插入图片描述
优先级要提前设定,然后再用start调度。
如果优先级低的先执行了,就会导致性能倒置。
在这里插入图片描述
daemon
在这里插入图片描述
在这里插入图片描述
每个对象都有一把锁。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

线程同步方法

在这里插入图片描述
在这里插入图片描述
sychronized默认锁的是this,所以不太对,但是run里面有可能操作的对象不是this。此时只锁一个方法并不能达到理想的效果,所以这个时候出现了同步块。
在这里插入图片描述
用法可以参考以下的代码
在这里插入图片描述
锁的对象就是变化的量,即需要增删改的量。
在这里插入图片描述
测试JUC安全类型的集合。
CopyOnWriteArrayList本身就是安全的。
在这里插入图片描述
在这里插入图片描述
互斥互斥的实现。
在这里插入图片描述
解决互斥
在这里插入图片描述
在这里插入图片描述
操作系统有没有。
在这里插入图片描述
使用方法:
在这里插入图片描述
在这里插入图片描述
sychronized与lock的对比
在这里插入图片描述
lock是代码块锁。
在这里插入图片描述
ReetrantLock。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上就是管城法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

线程池

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

在这里插入图片描述
以上是进程的创建。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值