zoukankan      html  css  js  c++  java
  • java学习--基础知识进阶第十一天--笔记

    今日内容
    多线程

    进程和线程
    进程:正在运行的程序,在内存中占有的内存空间
    线程:进程中的一条执行单元,执行路径

    进程中包含线程,可以有一条,也可以有多条,至少有一条

    多线程的实现方式
    方式一:继承Thread类的方式

    步骤:
    (1)自定义一个类,继承Thread类
    (2)在自定义类中重写run()方法,run()方法中就是多线程执行的核心代码
    (3)在测试了中,创建自定义类的对象
    (4)调用start()启动线程

    // (1)自定义一个类,继承Thread类
    class MyThread extends Thread {
    // (2)在自定义类中重写run()方法,run()方法中就是多线程执行的核心代码
    public void run() {

    }
    }

    public class Test {
    public static void main(String[] args){
    // (3)在测试了中,创建自定义类的对象
    MyThread mt = new MyThread();
    // (4)调用start()启动线程
    mt.start();
    }
    }


    线程有默认名称,普通线程默认为Thread-n,n从0开始递增
    主线程默认的名称为main

    修改线程默认名称:
    * void setName(String name)
    * Thread(Runnable target, String name),构造方法

    方式二:实现Runnable接口
    步骤:
    (1)自定义一个类实现Runnable接口
    (2)实现run()方法,编写多线程执行的核心代码
    (3)在测试类中,创建自定义类的对象
    (4)创建Thread类的对象,将自定义类的对象当做参数传递
    (5)使用Thread类的对象调用start()启动线程

    // (1)自定义一个类实现Runnable接口
    class MyThread implements Runnable {
    // (2)实现run()方法,编写多线程执行的核心代码
    public void run(){

    }
    }

    public class Test {
    public static void main(String[] args){
    // (3)在测试类中,创建自定义类的对象
    MyThread mt = new MyThread();
    // (4)创建Thread类的对象,将自定义类的对象当做参数传递
    Thread th = new Thread(mt);
    // (5)使用Thread类的对象调用start()启动线程
    th.start();
    }
    }

    面试题:
    1.启动线程调用的是start()方法还是run()方法?
    调用start(),该方法会启动线程并执行run()方法中的代码
    如果直接调用run()方法,不能启动线程,相等于调用了一个普通方法

    2.继承Thread类和实现Runnable接口这两种方式实现多线程的区别?
    继承Thread类
    优点:方便,继承Thread类就是该类的子类,可以继承Thread类中方法直接使用
    弊端:Java中的类是单一继承的,如果继承了Thread类不能继承其他的类,或者继承了其他的类,就不能再继承Thread类
    实现Runnable接口
    优点:打破单一继承,即使自定义类继承了其他的类,依然可以实现Runnable接口
    弊端:不方便,实现了Runnable接口,不能直接使用Thread类中的方法,如果要使用,必须先获取线程对象,再调用

    Thread类
    构造方法
    Thread(Runnable target)
    Thread(Runnable target, String name) :在创建线程对象的同时,可以设置名字

    常用方法
    start() :启动线程
    run() :线程执行的核心方法
    setName(String name) :设置线程名称
    getName() :获取线程名称
    static Thread currentThread() :获取当前正在执行的线程的对象,可以直接通过类名.的方式调用
    static void sleep(long millis) :线程休眠,使线程睡一会儿,时间到会自动醒来,静态方法可以直接类名.的方式调用

    多线程的安全问题
    产生的原因:多个线程操作共享数据

    解决:使用synchronized关键字
    synchronized关键字可以修饰方法,还可以修饰代码块,修饰的方法叫同步方法,修饰的代码块叫同步代码块

    同步代码块
    格式:
    synchronized(锁对象) {

    }
    注:锁对象可以是任意对象,可以随便创建Object对象,也可以是Student对象,甚至一个字符串对象
    但是,必须保证锁对象被所有的线程所共享

    同步方法
    使用synchronized关键字修饰的方法,方法中的所有代码都是在锁里

    非静态的同步方法的锁对象是this
    静态的同步方法的锁对象是该类的字节码对象

    同步和非同步
    同步(线程安全,加锁):安全,效率低
    非同步(线程不安全,没有加锁):不安全,效率高

  • 相关阅读:
    搭建企业级Docker Registry -- Harbor
    搭建私服-docker registry
    CentOS 7.2修改网卡名称
    tomcat错误日志监控脚本
    Openresty+Lua+Redis灰度发布
    Jenkins权限控制-Role Strategy Plugin插件使用
    Rsyslog日志服务搭建
    awk4.0对数组value排序
    Spring-IOC 在非 web 环境下优雅关闭容器
    Spring-IOC bean 生命周期之 Lifecycle 钩子
  • 原文地址:https://www.cnblogs.com/bigorangehasc/p/8639647.html
Copyright © 2011-2022 走看看