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
    静态的同步方法的锁对象是该类的字节码对象

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

  • 相关阅读:
    luogu P1833 樱花 看成混合背包
    luogu P1077 摆花 基础记数dp
    luogu P1095 守望者的逃离 经典dp
    Even Subset Sum Problem CodeForces
    Maximum White Subtree CodeForces
    Sleeping Schedule CodeForces
    Bombs CodeForces
    病毒侵袭持续中 HDU
    病毒侵袭 HDU
    Educational Codeforces Round 35 (Rated for Div. 2)
  • 原文地址:https://www.cnblogs.com/bigorangehasc/p/8639647.html
Copyright © 2011-2022 走看看