多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

导读:本篇文章讲解 多线程之一(进程理解、线程理解与创建、Thread类、线程状态),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

1. 进程理解

1.1 进程管理

1.2 PCB属性

 1.3 虚拟地址空间&进程间通信

2.多线程理解(Thread)

2.1 线程概念

2.2 线程的作用

2.3 进程和线程的区别(*)

2.4 多线程需要注意的问题

3. 线程创建

3.1 创建线程(继承Thread类)

 3.2 Jconsole工具查看线程

 3.3 创建线程其他方法

3.3.1 实现Runnable接口,重写run方法

3.3.2 使用匿名内部类,实现创建Thread子类的方式

3.3.3 使用匿名内部类,实现Runnable接口的方法

3.3.4 lambda表达式

4. Thread类的常见方法

4.1 Thread常见构造方法 

 4.2 Thread的常见属性

 4.3 线程启动(start和run的区别*)

4.4 线程中断(isInterrupted)

4.5 线程等待(join)

4.6 获取当前线程引用

5. 线程状态


1. 进程理解

进程是操作系统对一个正在运行的程序的一种抽象,通俗的说,进程就是运行起来的程序;
同一时刻系统中的进程,有很多,而操作系统就得给他们安排好,
也就是
进程是操作系统进行资源分配的基本单位。

1.1 进程管理

进程管理 = 描述 + 组织

描述:详细的表示一个进程中有哪些属性/信息,而结构体就是用来描述的;

一个结构体对象对应一个进程,结构体也叫PCB(进程控制块)

组织:通过一定的数据结构,将若干个用来描述的实体组织到一起,进行增删改查;

系统通常会使用 双向链表 这样的结构来将PCB组织到一起。

创建一个进程,本质上就是创建PCB,给进程分配资源赋值到PCB中,并且加入到链表上

销毁一个进程,本质上就是从链表上删除对应的PCB结点,是否PCB持有的资源

查看任务管理器的进程列表,本质上就是在遍历这个链表

一个进程也可以是多个PCB,系统管理PCB的链表也可能是多个

1.2 PCB属性

(1)PID:进程的身份表示

一个主机,同一时刻,进程的pid是唯一的(相当于身份证号),可以通过pid区分进程

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

(2)内存指针:描述了这个进程使用的内存空间是哪个范围(分配空间范围)

(3)文件描述符:描述了这个进程打开了哪些文件(文件就是存储在硬盘上的数据)

下面几点都是和 “进程调度” 有关的

进程调度就是通过 “并行” 和 “并发” 的方式,让计算机可以同时执行多个进程

并行执行:每个CPU核心上,都可以独立运行一个进程

                  多个CPU核心上,就可以独立运行多个进程

并发执行:一个CPU核心,先运行进程1,再运行进程2,再运行进程3…

                宏观上,同时运行多个程序;微观上,同一时刻运行一个程序

(4)进程状态: R(可执行状态)  S(可中断睡眠状态) X(退出状态)  D    T     Z

阻塞状态的进程,无法被调度到CPU上执行

就绪状态的进程,才可以在CPU上执行

(5)进程优先级:优先给谁安排先执行

系统调度的时候,就会根据优先级,来给进程安排执行时间

创建进程时,也可以通过系统调用来干预优先级(相对的)

(6)进程上下文:主要存储调度出CPU之前,寄存器的信息(把寄存器的信息保存到内存中)等到这个进程下次恢复到CPU上次执行时,将内存数据恢复到寄存器中

通俗的说就是“读档”和“存档”

进程在CPU上执行,要切换到别的进程,就需要保存当前运行结果的中间结果(存档),下次再到他执行时,就恢复之前的中间结果(读档),然后继续执行。

(7)进程的记账信息:记录进程在CPU上执行时长

再来辅助决定,进程是在CPU上继续执行,还是调度出去 

 1.3 虚拟地址空间&进程间通信

为了不出现进程间互相影响,指针越界操作等情况,就需要让每个进程都有各自的内存空间,不让这些进程的活动范围重叠,给每个进程划分的内存空间,就叫做 “虚拟地址空间”(不是真实的物理内存地址),通过专门的设备MMU来完成虚拟地址,到物理之前的映射

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

使用虚拟地址空间,就让进程间存在了 “隔离性”

(一个进程不能直接访问另一个进程的内存数据,防止干扰操作,提高系统稳定性)

但这样就会导致进程之间很难进行交互,为了解决这个问题又有了“进程间通信”

进程间通信:核心原理就是,找多个进程都可以访问到的公共资源,然后基于公共资源进行数据交换。

主流操作系统提供的进程通信机制有:文件、Socket(网卡)
、管道、消息队列、磁盘、信号量、信号

2.多线程理解(Thread)

2.1 线程概念

一个线程就是一个执行流(按一定顺序执行的一组代码),
每个线程之间都可以按照顺序执行自己的代码,多个线程之间“同时”执行多份代码

同一个进程中的这些线程,共用一份系统资源(内存+文件)

进程是 资源分配 的基本单位

线程是 调度执行 的基本单位

2.2 线程的作用

首先是,因为“并发编程”可以更充分利用CPU

其次,多进程虽然也可以实现并发编程,但线程比进程更轻量

(创建、销毁、调度线程都比进程更快)

所以,使用多线程:

1.能够充分利用多核CPU,能够提高效率

2.只是创建第一个线程时,需要申请资源,后续再创建新的进程,都是共用一份资源

销毁线程时,也是销毁到最后一个的时候,才真正释放资源,前面的线程销毁,都不必真的释放资源

最后,又有了更好的方法,“线程池”和“协程”

2.3 进程和线程的区别(*)

1.进程包含线程(多个)

2.线程比进程更轻量(创建、销毁、调度更快)

3.同一个进程的多个线程之间共用同一份内存/文件资源,

   进程和进程之间,则是独立的内存/文件资源

4.进程是操作系统资源分配的基本单位

   线程是操作系统调度执行的基本单位

2.4 多线程需要注意的问题

1. 多线程,一定程度下,线程数目越多,效率越高;但CPU核心数是有限的,当线程数目多到一定程度的时候,CPU核心就被占满了,线程调度开销太大,反而会使效率变慢

2. 当两个线程去争夺同一个资源是,此时两个线程就出现了问题,这就会使“线程不安全”

3. 如果某个线程出现异常,并且异常没有处理好,此时就可能会使整个进程崩溃,此时其他线程也会运行出现问题


3. 线程创建

3.1 创建线程(继承Thread类)

继承Thread类,重写run方法

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("thread!");
    }
}

标准库中,提供了一个Thread类,使用的时候就可以继承这个类

Thread类,相当于是对操作系统中的线程进行的封装

重写run方法,run是Thread父类中已有的方法,但是这里要重写

run中的逻辑,就是这个线程要执行的工作

创建子类,重写run方法,相当于“安排任务”

public class Demo01 {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

创建MyThread实例,并不会在系统中真的创建一个线程

而是,调用start方法的时候,才可以真正创建线程

新的线程才会执行run方法中的逻辑,直到run中逻辑执行完,新的线程才会运行结束

class MyThread extends Thread {
    @Override
    public void run() {
        while(true) {
            System.out.println("hello thread!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}
public class Demo01 {
    public static void main(String[] args) throws InterruptedException {
        MyThread myThread = new MyThread();
        myThread.start();
        while(true) {
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}

抢占式执行

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

 3.2 Jconsole工具查看线程

(1)找到自己电脑上JDK安装路径中的bin—》jconsole.exe打开

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

 (2)点击本地进程,选择当前项目连接,连接成功后,就可以查看当前项目中的线程

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

 (3)选择查看线程信息

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

 3.3 创建线程其他方法

3.3.1 实现Runnable接口,重写run方法

 创建了Runnable实例,将runnable实例作为参数传给线程

将线程要干的工作 和 线程本身 分开了,使用Runnable来专门表示“线程要完成的工作”

这种方法的好处是,降低了耦合性,如果以后要修改代码,改动相对较少

只需要将修改后的Runnable传给其他的实体就可以了

并且如果是多个线程干一样的工作,Runnable也更适合

class MyRunnable implements Runnable {
    @Override
    public void run() {
        while(true) {
            System.out.println("hello thread!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class Demo02 {
    public static void main(String[] args) throws InterruptedException {
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
        while (true) {
            System.out.println("hello main!");
            Thread.sleep(1000);
        }
    }
}

3.3.2 使用匿名内部类,实现创建Thread子类的方式

创建Thread的子类,同时实例化出一个对象

public class Demo03 {
    public static void main(String[] args) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                while(true) {
                    System.out.println("hello thread!");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        thread.start();
    }
}

3.3.3 使用匿名内部类,实现Runnable接口的方法

匿名内部类的实例,作为构造方法的参数

public class Demo04 {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello thread!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        thread.start();
    }
}

3.3.4 lambda表达式

public class Demo05 {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            while (true) {
                System.out.println("hello thread!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }
}

4. Thread类的常见方法

4.1 Thread常见构造方法 

方法 说明
Thread() 创建线程对象
Thread(Runnable target) 使用Runnable对象创建线程对象
Thread(String name) 创建线程对象,并命名
Thread(Runnable target, String name) 使用Runnable对象创建线程对象,并命名

public class demo01 {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            while (true) {
                System.out.println("hello");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"这是线程名");
        thread.start();
    }
}

打开Jconsole.exe,可以看到线程的名字,就是我们自己命名出来的

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

 4.2 Thread的常见属性

属性 获取方法
ID getId()
名称 getName()
状态 getState()
优先级 getPriority()
是否后台线程 isDaemon()
是否存活 isAlive()
是否被中断 isInterrupted()

(1)getId() 这个是java中给Thread对象安排的身份标识,和操作系统内核中PCB的pid,以及操作系统提供的线程API的线程id都不是一个

(2)setDaemon() 判断是否是守护线程。默认创建的线程是“前台线程”,前台线程会阻止进程退出,如果main运行完,前台线程还没完,进程不会退出;如果是“后台线程”,后台线程不会阻止进程退出,如果main等其他的前台进程执行完,此时即使后台线程没执行完,也会退出。

“只要有一个前台(main也是一个前台),进程就还活着,前台没了,后台也会没”

设置操作得在start之前,如果线程启动,就不能修改 

public class demo01 {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            while (true) {
                System.out.println("hello");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"这是线程名");
        //使用setDaemon设置为后台线程
        //设置操作得在start之前,如果线程启动,就不能改
        thread.setDaemon(true);
        thread.start();
        System.out.println("main线程执行结束!");
    }
}

(3)isAlive() 判断内核中线程是否存活。Thread对象,虽然和内核中的线程,是一一对应关系,但是生命周期并非完全相同;Thread对象存在了,内核里的线程不一定有,调用start方法,内核线程才存在。当内核里的线程执行完(run运行完),内核的线程就销毁了,但是Thread对象还在

(4)写一段代码看看Thread属性 

public class Demo02 {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            while(true) {
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"我的线程");
        thread.start();
        System.out.println(thread.getId());
        System.out.println(thread.getName());
        System.out.println(thread.getPriority());
        System.out.println(thread.getState());
        System.out.println(thread.isDaemon());
        System.out.println(thread.isAlive());
        System.out.println(thread.isInterrupted());
    }
}

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

 4.3 线程启动(start和run的区别*)

调用start才会真正创建线程,不调用start就没创建线程(在内核里创建PCB)

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("hello thread!");
    }
}
public class Demo03 {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();//创建一个新线程,调用run
        //myThread.run();//在当前线程调用run
    }
}

start 和run的区别(*)

直接调用run,并没有创建线程,只是在原来的线程中运行代码

调用start,则是创建了线程,在新线程中执行代码(和原来的线程是并发的)

作用功能不同:

  1. run方法的作用是描述线程具体要执行的任务;
  2. start方法的作用是真正的去申请系统线程

运行结果不同:

  1. run方法是一个类中的普通方法,主动调用和调用普通方法一样,会顺序执行一次;
  2. start调用方法后, start方法内部会调用Java 本地方法(封装了对系统底层的调用)真正的启动线程,并执行run方法中的代码,run 方法执行完成后线程进入销毁阶段。

4.4 线程中断(isInterrupted)

线程中断,本质上是让run方法尽快结束,而不是run执行一半,强制结束

有两种方法

(1)直接自己定义一个标志位,作为线程是否结束的标记

public class Demo04 {
    private static boolean isQuit = false;

    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            while (!isQuit) {
                System.out.println("hello tread!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("thread线程执行完了!");
        });
        thread.start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        isQuit = true;
        System.out.println("设置让thread线程结束!");
    }
}

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

 (2)使用标准库中自带的标记位interrupt

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

public class Demo05 {
        public static void main(String[] args) {
            Thread thread = new Thread(() -> {
                while (!Thread.currentThread().isInterrupted()) {
                    System.out.println("hello tread!");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("thread线程执行完了!");
            });
            thread.start();
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            thread.interrupt();
            System.out.println("设置让thread线程结束!");
        }
}

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

 运行程序,发现出现了异常,这是因为

interrupt方法的行为,有两种情况

1.thread线程在运行状态会设置,标志位为true

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

 2.thread线程在阻塞状态(sleep)不会设置标志位(实际是interrupt会设置标志位,但是sleep/wait等这些阻塞方法,会清除这个标志位),而是触发一个InterruptedException

这个异常会把sleep提前唤醒

所以,要想顺利结束循环,由线程自身的代码进行判定处理

线程自身可以(1)立即结束线程(break)

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

(2)啥都不干

(3)稍后处理(sleep,break

 多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

4.5 线程等待(join)

线程之间的调度顺序,是不确定的,可以通过join来控制线程之间的结束顺序

方法 说明
join() 等待线程结束
join(long millis) 等待线程结束,最多等millios毫秒
join(long millis, int nanos) 也可以等待更高精度的时间 毫秒+纳秒

 在main中,调用join效果就是,让main线程阻塞等待,等到thread执行完,main才继续执行

public class Demo06 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("hello thread!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
        System.out.println("main线程join之前");
        thread.join();
        System.out.println("main线程join之后");
    }
}

4.6 获取当前线程引用

currentThread();   获取到当前这个线程对应的Thread对象的引用

5. 线程状态

NEW:
安排了工作
,
还未开始行动(Thread对象创建出来了,但是内核的PCB还没创建,(还没真正创建线程))
RUNNABLE:
可工作的
.
又可以分成正在工作中和即将开始工作(就绪状态(正在CPU上运行+在就绪队列中排队))
BLOCKED:
这几个都表示排队等着其他事情(等待锁的时候进入阻塞状态)
WAITING:
这几个都表示排队等着其他事情(特殊的阻塞状态,调用wait)
TIMED_WAITING:
这几个都表示排队等着其他事情(按照一定的时间,进行阻塞sleep)
TERMINATED:
工作完成了
(内核的PCB销毁了,但是Thread对象还在)

 多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

public class Demo07 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        });
        //tread开始之前,得到的就是 NEW
        System.out.println(thread.getState());
        thread.start();

        Thread.sleep(50);
        //tread正在工作,得到的是 RUNNABLE
        System.out.println(thread.getState());

        thread.join();
        //tread结束之后,得到的状态是 TERMINATED
        System.out.println(thread.getState());
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/87336.html

(0)
小半的头像小半
0 0

相关推荐

  • 一些工具文档网站 技术随笔

    一些工具文档网站

    0 0196
    Java光头强的头像 Java光头强
    2023年2月18日
  • 二叉树 | n叉树:派对的最大快乐值「二叉树的递归套路推广到n叉树」 技术随笔

    二叉树 | n叉树:派对的最大快乐值「二叉树的递归套路推广到n叉树」

    0 0189
    小半的头像 小半
    2023年1月29日
  • Spring Boot——第05讲属性基础配置 技术随笔

    Spring Boot——第05讲属性基础配置

    0 0234
    Java光头强的头像 Java光头强
    2023年2月18日
  • 微服务 过滤器 集成Sentinel实现网关限流 技术随笔

    微服务 过滤器 集成Sentinel实现网关限流

    0 0282
    飞熊的头像 飞熊
    2023年5月4日
  • 设计模式之责任链模式 技术随笔

    设计模式之责任链模式

    0 0143
    飞熊的头像 飞熊
    2023年8月2日
  • 简单使用 uwsgi + nginx 在本地 Ubuntu 成功部署 django 项目 技术随笔

    简单使用 uwsgi + nginx 在本地 Ubuntu 成功部署 django 项目

    0 0387
    小半的头像 小半
    2023年2月11日
  • Java中retainAll方法使用 技术随笔

    Java中retainAll方法使用

    0 0183
    小半的头像 小半
    2023年2月13日
  • 【搭建博客服务端部分】第四部分 分类接口 技术随笔

    【搭建博客服务端部分】第四部分 分类接口

    0 0240
    小半的头像 小半
    2023年1月24日
  • 如何在Salesforce Lightning组件中创建模态/弹出框 技术随笔

    如何在Salesforce Lightning组件中创建模态/弹出框

    0 0179
    小半的头像 小半
    2023年2月10日
  • 数组方法详解 技术随笔

    数组方法详解

    0 0140
    小半的头像 小半
    2023年1月18日
  • 一篇了解RabbitMQ 技术随笔

    一篇了解RabbitMQ

    0 0188
    小半的头像 小半
    2023年2月8日
  • 弗洛伊德算法和迪杰斯特拉算法解决最短路径问题 技术随笔

    弗洛伊德算法和迪杰斯特拉算法解决最短路径问题

    0 0113
    小半的头像 小半
    2023年2月17日

扫我!扫我!扫码!

多线程之一(进程理解、线程理解与创建、Thread类、线程状态)

站长精选

  • 数据脱敏的3种常见方案,好用到爆!

    数据脱敏的3种常见方案,好用到爆!

    2024年2月1日

  • 微软出品,鲜为人知却无比实用的逆天小工具,来了解一下?

    微软出品,鲜为人知却无比实用的逆天小工具,来了解一下?

    2023年4月6日

  • 一套万能的异步处理方案(典藏版)

    一套万能的异步处理方案(典藏版)

    2024年8月5日

  • 这样Debug,排查问题效率大大提升...

    这样Debug,排查问题效率大大提升…

    2023年3月7日

  • 流程引擎的架构设计

    流程引擎的架构设计

    2022年11月15日

  • 从 Future 到 CompletableFuture:简化 Java 中的异步编程

    从 Future 到 CompletableFuture:简化 Java 中的异步编程

    2023年8月20日

  • 16 张图硬核讲解 Kubernetes 网络模型

    16 张图硬核讲解 Kubernetes 网络模型

    2023年7月20日

  • 微软发布史上最强虚拟机!流畅度堪比主机!!!

    微软发布史上最强虚拟机!流畅度堪比主机!!!

    2023年9月23日

  • IDEA 28 个天花板技巧 + 12 款神级插件

    IDEA 28 个天花板技巧 + 12 款神级插件

    2023年11月12日

  • 面试官问:select......for update会锁表还是锁行?

    面试官问:select……for update会锁表还是锁行?

    2023年8月17日

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!

玻璃钢生产厂家学校校园玻璃钢景观雕塑设计泡沫加玻璃钢雕塑深圳人物玻璃钢雕塑仿真玻璃钢雕塑订制四平玻璃钢雕塑厂家定制江西抽象玻璃钢雕塑批发成都唐煌玻璃钢雕塑安徽人物玻璃钢雕塑多少钱质量好价格低的玻璃钢花盆玻璃钢人物雕塑定制十二生肖卡通玻璃钢雕塑园林雕塑山东玻璃钢花盆订购白城玻璃钢花盆花器鹤壁室内玻璃钢雕塑生产玻璃钢迎宾人物雕塑湖南省玻璃钢雕塑加工上海商场节日活动美陈布置阜阳学校玻璃钢雕塑生产厂家贵阳玻璃钢人像雕塑图片吉林长春玻璃钢雕塑四川大型商场创意商业美陈浙江商场开业美陈品牌玻璃钢卡通雕塑销售价格玻璃钢猪妈妈雕塑玻璃钢雕塑的施工方法周年商场美陈售价保山市玻璃钢雕塑定制宁乡玻璃钢雕塑公司浙江艺术商场美陈厂家供应不锈钢太湖石玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化