韩顺平Java自学笔记 线程

目录

一。并发和并行

二。有关于线程的基本原理

1.第一种创建线程的方式

2.多线程机制

3.第二种创建线程的方式

四。创建线程后的操作

1.线程终止

2.线程的中断

3.线程插队

4.守护线程

五。线程的七大状态

六。线程的同步机制

1.使用场景和作用

九。线程锁

1.互斥锁

2.死锁

3.释放锁

十。最后例题

1.作业一

2.作业二


一。并发和并行

个人理解:多线程就是一个程序可以干很多事

单线程:同一时间,只允许执行一个线程

多线程:同一时间,可以执行多个线程  

例如:一个QQ可以进行多个聊天进程,一个迅雷下载可以进行多个下载的人物。简单来说多线程就是一个程序可以在同一时间执行多个任务。

并发与并行

并发:同一时间多个任务交替执行,造成貌似在同时处理多件事的效果。

例如:一个人既在开车又在打电话

 

例如:单核cpu处理多个进程。

并行:同一时间多个cpu处理多个进程。多核cpu实现并行。

例如:一个人打电话一个人开车

补充:可以通过任务管理器查看电脑进程,可以通过 任务管理器——性能——打开资源监控器——cpu    可以查看自己电脑cpu的状态

通过下列代码可以查看自己电脑cpu为几核

public class CpuNum {
    public static void main(String[] args) {
        Runtime runtime = Runtime.getRuntime();
        int i = runtime.availableProcessors();
        System.out.println(i);
    }
}

二。有关于线程的基本原理

1.第一种创建线程的方式

一共有两种创建方式,实现接口的更具有广泛性(更好使)

继承Thread类,然后重写run()方法

public class Thread1 {
    public static void main(String[] args) {
        Mao mao = new Mao();
        mao.start();
        System.out.println("线程的名字是"+Thread.currentThread().getName());
    }
}

class Mao extends Thread{
    @Override
    public void run() {
        System.out.println("猫猫在喵喵叫。。。");
        System.out.println("线程的名字是"+Thread.currentThread().getName());
    }
}

问题:为什么调用使用的是start方法,而不是run,原因如下图,真正创建线程的是start方法当中的start0方法,而不是run方法。

运行结果:

线程的名字是main
猫猫在喵喵叫。。。
线程的名字是Thread-1

补充:我们通过下面两行代码获取了线程的名字,以证明确实是创建了线程的.其中main线程是主方法自带的线程。Thread-1是我们通过继承Thread创建的

System.out.println("线程的名字是"+Thread.currentThread().getName());

例题:

 

注意:JConsole我跳过了,没有学。sorry。 

休眠方法:参数为毫秒数1000ms=1s  也就是间隔时间1执行一次

Thread.sleep(1000);

注意:该方法会报 InterruptedException异常所以要进行cry/catch或者异常抛出(方法写在run()方法中)

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

答案:

public class Thread1 {
    public static void main(String[] args) {
        Mao mao = new Mao();
        mao.start();
    }
}

class Mao extends Thread{
    private int count = 0;
    private boolean bool = true;
    @Override
    public void run() {
        while (bool){
            if (count==80){
                bool =false;
                return;
            }
            System.out.println("喵喵,我是小猫咪!"+(++count));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

 通过while循环,通过bool的值来控制循环,当退出循环hou,run()方法执行完毕,线程关闭。(稍后会讲解使用查看线程状态的方法)

2.多线程机制

修改一行代码,查看线程名

            System.out.println("喵喵,我是小猫咪!"+(++count)+Thread.currentThread().getName());

得到:

喵喵,我是小猫咪!1线程名为Thread-0
喵喵,我是小猫咪!2线程名为Thread-0
喵喵,我是小猫咪!3线程名为Thread-0

 下图为线程之间的关系,通过start()创建的子线程

 对答案代码进行修改

public class Thread1 {
    public static void main(String[] args) throws InterruptedException {
        Mao mao = new Mao();
        mao.start();

        System.out.println("主线程执行"+Thread.currentThread().getName());

        for (int i = 0;i<10;i++){
            System.out.println("主线程 i="+i);
            Thread.sleep(1000);
        }
    }
}

class Mao extends Thread{
    private int count = 0;
    private boolean bool = true;
    @Override
    public void run() {
        while (bool){
            if (count==80){
                bool =false;
                break;
            }
            System.out.println("喵喵,我是小猫咪!"+(++count)+"线程名为"+Thread.currentThread().getName());
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 执行会发现,主线程与子线程一起执行并且主线程是否结束执行不会影响到子线程的执行。

3.第二种创建线程的方式

使用实现Runnable接口的方法来实现多线程

说明:Java是单继承,为避免已经有继承的父类,而无法使用第一种方法,所以创建了Runnable接口。

使用:

public class Thread02 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Thread thread = new Thread(dog);
        thread.start();
    }
}

class Dog implements Runnable{


    int count = 0;

    @Override
    public void run() {
        while (true){
            try {
                System.out.println("小狗创造。。");

                Thread.sleep(1000);
            } catch (Exception e) {
     
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值