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();
    }
    }

  • 相关阅读:
    4 Apr 18 软件开发目录 logging模块的使用 序列化(Json, Pickle) os模块
    3 Apr 18 内置函数 列表生成式与生成器表达式 模块的使用之import 模块的使用之from…import…
    2 Apr 18 三元表达式 函数递归 匿名函数 内置函数
    30 Mar 18 迭代器 生成器 面向过程的编程
    29 Mar 18 函数 有参、无参装饰器
    28 Mar 18 函数
    27 Mar 18 函数的参数
    26 Mar 18 函数介绍
    23 Mar 18 文件处理
    22 Mar 18 补充数据类型+字符编码+文件处理
  • 原文地址:https://www.cnblogs.com/curedfisher/p/12446623.html
Copyright © 2011-2022 走看看