java 自学过程中记录->多线程

多线程

  1. 程序 : 为完成特定任务,编写的指令集 ,是静态的;
  2. 进程:正在执行的程序,动态过程;
  3. 线程:进程可细化为线程,是一个程序内部的一条执行路径。
    • 若一个进程同一时间并行执行多个线程,就是支持多线程
    • 线程作为调度和执行单位,每个线程拥有独立的运行栈和程序计数器,线程的切换开销小
    • 一个进程中多个线程共享相同的内存地址空间 ------但多个线程操作共享的系统资源可能就会带来安全隐患
单核CPU和多核CPU的理解
  • 单核CPU,其实是一种假的多线程

  • 多核才能更好地发挥多线程的效率(现在的服务器都是多核的)

  • 一个Java应用程序java.exe , 其实至少又是那个线程:main()主线程,gc()垃圾回收线程,异常处理线程(当然发生异常会影响主线程)


    并行 与 并发
    • 并行:多个CPU同时执行多个任务。
    • 并发: 一个CPU(采用时间片)同时执行多个任务

单核CPU 执行多线程的效率不如单线程

但因为其用户体验更好,图形窗口,后台运行的程序等

多线程

  • 1.写一个继承于Tread 类的子类
  • 2.重写 run() 方法 -->将此线程执行的操作声明在run()中
  • 3.创建Thread的子类的对象
  • 4.同过此对象调用start()

注意点:

  • 不能用run() 代替start 那样就不是多线程
  • 不可以让已经start();的线程再去start(); 想让该线程再次启动,可以重新创建一个线程对象

上代码!

class MyTread extends Thread{//1
    @Override
    public void run() {//2
        for (int i = 0; i < 100; i++) {
            if(i%3 == 0){
                System.out.println(Thread.currentThread().getName()+i+"**Tread**");
            }
        }
    }
}

public class Demo01 {
    public static void main(String[] args) {
        MyTread t = new MyTread();//3
        t.start();//4
        //t.run(); 不能用run() 代替start 那样就不是多线程


        // 不可以让已经start();的线程再去start();
        // t.start(); 会有异常 IllegalThreadStateException
        // 想让该线程再次启动,可以重新创建一个线程对象 如下:
        MyTread t1 = new MyTread();
        t1.start();

        for (int i = 0; i < 100; i++) {
            if(i%3 == 0){
                System.out.println(Thread.currentThread().getName()+i+"**main**");
            }
    }
}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOLo99lw-1628327296569)(C:\Users\xzwc\Pictures\代码 运行图\多线程2.png)]

部分运行图如上

创建两个分线程

(匿名子类 的写法可以让代码更简洁)

class MyThread1 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if(i%2 == 0){
                System.out.println(Thread.currentThread().getName()+"*******"+i+"*********");
            }
        }
    }
}

class MyThread2 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if(i%2 != 0){
                System.out.println(Thread.currentThread().getName()+"*******"+i+"*********");
            }
        }
    }
}

public class ThreadDemo01 {
    public static void main(String[] args) {
        MyThread1 t1 = new MyThread1();
        MyThread2 t2 = new MyThread2();
        t1.start();
        t2.start();

        // 为了代码精简可以用匿名子类的方式
      /*  new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    if(i%3 == 0){
                        System.out.println(Thread.currentThread().getName()+i);//100 内被3整除的数
                    }
                }
            }
        }.start();*/

    }

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mlY9D1RR-1628327296582)(C:\Users\xzwc\Pictures\代码 运行图\屏幕截图 2021-08-07 164526.png)]

可由上面的部分运行图 看出多个线程间切换达到多线程的效果

            }
        }
    }.start();*/

}

}


[外链图片转存中...(img-mlY9D1RR-1628327296582)]

可由上面的部分运行图 看出多个线程间切换达到多线程的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

k24独

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值