• JAVA之线程学习


    进程:一个应用程序在处理机上的一次执行过程,它是一个动态的概念,包含一个或多个线程。

    线程:是进程的一个实体,是CPU调度和分派的基本单位。

    一个线程的生命周期:

      新建状态(start())

      就绪状态(start())

           运行状态(run())

           阻塞状态()

           死亡状态(stop()或destory())

    如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:

    • 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。

    • 同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。

    • 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

    线程优先级:Java 线程的优先级是一个整数,其取值范围是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。

    默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。

    Java线程的几个重要方法

    1.start()与run():实现线程类时无论是继承Thread类还是实现Runnable接口,都要实现run()方法          实现具体的线程业务逻辑,但是真正启动线程类时要注意使用start()方法,调用         run()方法并不会启动一个线程去执行,只会当成普通的类方法来执行。
             所以start()方法会启动2个线程运行,而run()方法只会启动一个线程。

    2.yield():暂停当前正在执行的线程对象,并执行其他线程。

          调用方法之后线程会立即释放占用的资源,CPU可以转向执行其它的线程。但是具体执      行哪个线程并不确定,所以也有可能下次还是执行当前线程。

    3.join():暂停当前正在执行的线程对象,并执行其他线程。

    4.sleep():在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)

    创建线程的方法

    1.通过继承Thread类

    package com.demo.thread;
    
    /*1.创建多线程:  继承Thread方法     重写run():查看Thread源码有个run方法
     *2.使用线程:创建子类对象,对象.start()启动
     *继承Thread类方式的缺点:如果一个类已经从一个类继承,则再无法继承Thread类
     * */
    class Thread1 extends Thread{
        @Override
        public void run() {
            //线程体,运行一切从run开始
            for(int i=0;i<5;i++){
                System.out.println("兔子跑了"+i+"");
            }
        }
    }
    class Thread2 extends Thread{
        @Override
        public void run() {
            //线程体,运行一切从run开始
            for(int i=0;i<5;i++){
                System.out.println("乌龟跑了"+i+"");
            }
        }
    }
    public class ThreadTest{
        public static void main(String[] args) {
            //创建子类对象
            Thread1 thread1= new Thread1();
            Thread2 thread2= new Thread2();
            //调用start方法,启动线程
            thread1.start();
            thread2.start();
        }
    }

    2.实现Runnable接口

    package com.demo.thread;
    /*使用Runnable创建线程:避免单继承的局限性,便于共享资源
     * 1.类实现Runnable接口+重写run()----->真实角色类
     * 2.启动多线程,使用静态代理
     *     1)创建真实角色
     *  2)创建代理角色+真实角色引用
     *  3)调用.start()启动线程
     * 
     * 
     * */
    class Runna implements Runnable{
    
        @Override
        public void run() {
            for(int i=0;i<1000;i++){
                System.out.println("一边吃饭");
            }
            
        }
        
    }
    public class RunnableTest {
            public static void main(String[] args) {
    //             1)创建真实角色
                Runna runna = new Runna();
    //             2)创建代理角色+真实角色引用
                Thread proxy = new Thread(runna);
    //             3)调用.start()启动线程
                proxy.start();
                
                for(int i=0;i<1000;i++){
                    System.out.println("一边玩手机");
                }
            }
    }

                                参考:菜鸟教程

                                                    详细线程介绍

  • 相关阅读:
    10个超实用的PHP代码片段
    MySQL支撑百万级流量高并发的网站部署详解
    程序员总结:帮助你早些明白一些道理
    50个最常用的UNIX / Linux命令(结合实例)
    php.ini 核心配置选项说明
    智能指针的死穴 循环引用
    滥用vector带来的瓶颈
    JS——层的遮罩效果
    【趣】无广告看视频
    【SQLServer】远程访问数据库进行配置
  • 原文地址:https://www.cnblogs.com/liurg/p/8280701.html
Copyright © 2020-2023  润新知