zoukankan      html  css  js  c++  java
  • 线程

    一.线程实现方式

    1.并发与并行

     ========================================================================================================================

    2.进程概念

     =========================================================================================================================

    3.线程概念

    ==========================================================================================================================4.线程调度

     

     =============================================================================================================

    5.主线程

     

     ==================================================================================================================

    6.创建多线程程序的第一种方式

     

     

     MyThread.java

    package com.itheima.demo06.Thread;
    //1.创建一个Thread类的子类
    public class MyThread extends Thread{
    //2.在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么?)
    @Override
    public void run() {
    for (int i = 0; i <20 ; i++) {
    System.out.println("run:"+i);
    }
    }
    }

    ---------------------------------------------------------------------------------------------------------------------------------------------

    Demo01Thread.java

    package com.itheima.demo06.Thread;
    /*
    创建多线程程序的第一种方式:创建Thread类的子类
    java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类

    实现步骤:
    1.创建一个Thread类的子类
    2.在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么?)
    3.创建Thread类的子类对象
    4.调用Thread类中的方法start方法,开启新的线程,执行run方法
    void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
    结果是两个线程并发地运行;当前线程(main线程)和另一个线程(创建的新线程,执行其 run 方法)。
    多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动
    java程序属于抢占式调度,那个线程的优先级高,那个线程优先执行;同一个优先级,随机选择一个执行
    */
    public class Demo01Thread {
    public static void main(String[] args) {
    //3.创建Thread类的子类对象
    MyThread mt = new MyThread();
    //4.调用Thread类中的方法start方法,开启新的线程,执行run方法
    mt.start();

    for (int i = 0; i <20 ; i++) {
    System.out.println("main:"+i);
    }
    }
    }

     ===================================================================================================================

    7.多线程原理_随机性打印结果

     ============================================================================================================

    8.多线程原理_多线程内存图解

     ===========================================================================================================

    9.Thread类的常用方法_获取线程名称

     MyThread.java

    package com.itheima.demo01.getName;
    /*
    获取线程的名称:
    1.使用Thread类中的方法getName()
    String getName() 返回该线程的名称。
    2.可以先获取到当前正在执行的线程,使用线程中的方法getName()获取线程的名称
    static Thread currentThread() 返回对当前正在执行的线程对象的引用
    */
    // 定义一个Thread类的子类
    public class MyThread extends Thread{
    //重写Thread类中的run方法,设置线程任务
    @Override
    public void run() {
    //获取线程名称
    //String name = getName();
    //System.out.println(name);

    //Thread t = Thread.currentThread();
    //System.out.println(t);//Thread[Thread-0,5,main]
    //String name = t.getName();
    //System.out.println(name);

    //链式编程
    System.out.println(Thread.currentThread().getName());
    }
    }

    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    Demo01GetThreadName.java

    package com.itheima.demo01.getName;
    /*
    线程的名称:
    主线程: main
    新线程: Thread-0,Thread-1,Thread-2
    */
    public class Demo01GetThreadName {
    public static void main(String[] args) {
    //创建Thread类的子类对象
    MyThread mt = new MyThread();
    //调用start方法,开启新线程,执行run方法
    mt.start();

    new MyThread().start();
    new MyThread().start();

    //链式编程
    System.out.println(Thread.currentThread().getName());
    }
    }

    =============================================================================================

    10.Thread类的常用方法_设置线程名称

    MyThread.java

    package com.itheima.demo02.setName;
    /*
    设置线程的名称:(了解)
    1.使用Thread类中的方法setName(名字)
    void setName(String name) 改变线程名称,使之与参数 name 相同
    2.创建一个带参数的构造方法,参数传递线程的名称;调用父类的带参构造方法,把线程名称传递给父类,让父类(Thread)给子线程起一个名字
    Thread(String name) 分配新的 Thread 对象
    */
    public class MyThread extends Thread{

    public MyThread(){}

    public MyThread(String name){
    super(name);//把线程名称传递给父类,让父类(Thread)给子线程起一个名字
    }

    @Override
    public void run() {
    //获取线程的名称
    System.out.println(Thread.currentThread().getName());
    }
    }
    -----------------------------------------------------------------------------------------------------------------------------------------------

    Demo01SetThreadName.java

    package com.itheima.demo02.setName;

    public class Demo01SetThreadName {
    public static void main(String[] args) {
    //开启多线程
    MyThread mt = new MyThread();
    mt.setName("小强");
    mt.start();

    //开启多线程
    new MyThread("旺财").start();
    }
    }

    ===================================================================================================

    11.Thread类的常用方法_sleep

     

     =============================================================================================================

    12.创建多线程程序的第二种方式_实现Runnable接口

     

    RunnableImpl.java

    package com.itheima.demo04.Runnable;
    //1.创建一个Runnable接口的实现类
    public class RunnableImpl implements Runnable{
    //2.在实现类中重写Runnable接口的run方法,设置线程任务
    @Override
    public void run() {
    for (int i = 0; i <20 ; i++) {
    System.out.println(Thread.currentThread().getName()+"-->"+i);
    }
    }
    }

    -------------------------------------------------------------------------------------------------------------------------------------------------

    Demo01Runnable.java

    package com.itheima.demo04.Runnable;
    /*
    创建多线程程序的第二种方式:实现Runnable接口
    java.lang.Runnable
    Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。
    java.lang.Thread类的构造方法
    Thread(Runnable target) 分配新的 Thread 对象。
    Thread(Runnable target, String name) 分配新的 Thread 对象。

    实现步骤:
    1.创建一个Runnable接口的实现类
    2.在实现类中重写Runnable接口的run方法,设置线程任务
    3.创建一个Runnable接口的实现类对象
    4.创建Thread类对象,构造方法中传递Runnable接口的实现类对象
    5.调用Thread类中的start方法,开启新的线程执行run方法

    实现Runnable接口创建多线程程序的好处:
    1.避免了单继承的局限性
    一个类只能继承一个类(一个人只能有一个亲爹),类继承了Thread类就不能继承其他的类
    实现了Runnable接口,还可以继承其他的类,实现其他的接口
    2.增强了程序的扩展性,降低了程序的耦合性(解耦)
    实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
    实现类中,重写了run方法:用来设置线程任务
    创建Thread类对象,调用start方法:用来开启新线程
    */
    public class Demo01Runnable {
    public static void main(String[] args) {
    //3.创建一个Runnable接口的实现类对象
    RunnableImpl run = new RunnableImpl();
    //4.创建Thread类对象,构造方法中传递Runnable接口的实现类对象
    //Thread t = new Thread(run);//打印线程名称
    Thread t = new Thread(new RunnableImpl2());//打印HelloWorld
    //5.调用Thread类中的start方法,开启新的线程执行run方法
    t.start();

    for (int i = 0; i <20 ; i++) {
    System.out.println(Thread.currentThread().getName()+"-->"+i);
    }
    }
    }

     

     =================================================================================================

    13.Thread和Runnable的区别

     

     RunnableImpl2.java

    package com.itheima.demo04.Runnable;
    //1.创建一个Runnable接口的实现类
    public class RunnableImpl2 implements Runnable{
    //2.在实现类中重写Runnable接口的run方法,设置线程任务
    @Override
    public void run() {
    for (int i = 0; i <20 ; i++) {
    System.out.println("HelloWorld"+i);
    }
    }
    }

    ------------------------------------------------------------------------------------------------

    Thread t = new Thread(new RunnableImpl2());//打印HelloWorld
    //5.调用Thread类中的start方法,开启新的线程执行run方法
    t.start()

    =================================================================================================

    14.匿名内部类方式实现线程的创建

    Demo01InnerClassThread.java

    package com.itheima.demo05.InnerClassThread;
    /*
    匿名内部类方式实现线程的创建

    匿名:没有名字
    内部类:写在其他类内部的类

    匿名内部类作用:简化代码
    把子类继承父类,重写父类的方法,创建子类对象合一步完成
    把实现类实现类接口,重写接口中的方法,创建实现类对象合成一步完成
    匿名内部类的最终产物:子类/实现类对象,而这个类没有名字

    格式:
    new 父类/接口(){
    重复父类/接口中的方法
    };
    */
    public class Demo01InnerClassThread {
    public static void main(String[] args) {
    //线程的父类是Thread
    // new MyThread().start();
    new Thread(){
    //重写run方法,设置线程任务
    @Override
    public void run() {
    for (int i = 0; i <20 ; i++) {
    System.out.println(Thread.currentThread().getName()+"-->"+"黑马");
    }
    }
    }.start();

    //线程的接口Runnable
    //Runnable r = new RunnableImpl();//多态
    Runnable r = new Runnable(){
    //重写run方法,设置线程任务
    @Override
    public void run() {
    for (int i = 0; i <20 ; i++) {
    System.out.println(Thread.currentThread().getName()+"-->"+"程序员");
    }
    }
    };
    new Thread(r).start();

    //简化接口的方式
    new Thread(new Runnable(){
    //重写run方法,设置线程任务
    @Override
    public void run() {
    for (int i = 0; i <20 ; i++) {
    System.out.println(Thread.currentThread().getName()+"-->"+"传智播客");
    }
    }
    }).start();
    }
    }

  • 相关阅读:
    @RequestParam方式传入list
    编写优美代码的七条规范(Python版)
    汇编程序设计入门
    CSP-S2020解题报告(待完成!)
    [USACO18JAN]MooTube
    DP优化
    AFO记
    考前总结
    清北学堂周末刷题班第五场
    清北学堂考前综合刷题班第四场
  • 原文地址:https://www.cnblogs.com/curedfisher/p/12446623.html
Copyright © 2011-2022 走看看